Как я могу читать / писать точные позиции файла в js, избегая условий гонки - PullRequest
0 голосов
/ 09 марта 2019

Я реализую дерево как простой массив (в смысле массива C ), в котором вместо указателей используются операции над индексами массива. Дерево станет очень большим, и мне нужно, чтобы оно сохранилось. Казалось бы, простейшие решения - это общий файл, в котором все данные массива просто соединены вместе.

Для доступа к листьям дерева мне нужно следующее:

  • Возможность чтения / записи одиночной серии 32-байтовых элементов в случайных позициях в файле.

  • Возможность "заблокировать" файл перед выполнением чтения / записи, так что другие асинхронные вызовы функций дерева должны будут ждать, пока обновляется дерево (потому что 1 обновляется абстракция дерева * , требуется несколько обновлений самого файла).

Я использую модуль fs, который поставляется с узлом для доступа к файловой системе, однако вызов open не блокирует его от других потоков, и я не вижу никакой документации по этому поводу. В идеале мне не нужно было бы блокировать больше, чем один этот файл, и это не создавало бы значительных накладных расходов, поскольку я буду выполнять десятки миллионов операций чтения / записи в дерево (что составляет 100 миллионов операций чтения / записи в файл). ).

1 Ответ

0 голосов
/ 12 марта 2019

Я решил это с помощью semephore.Ничего действительно не должно происходить на уровне операционной системы.Семафор просто заключает мою функцию в semephore.take(myTrie.put()), и когда она вызывается несколько раз, она помещает содержащие функции в очередь, вызывая каждую из них только после того, как предыдущий вызвал semephore.leave() (который я вызываю во время ее разрешения).

...