2010-05-05 6 views
1

В моей программе я держу два файла, открытых для записи, контент-файл, содержащий куски данных, и индексный файл, содержащий карту, над которой были записаны фрагменты данных.Есть ли способ posix для обеспечения того, чтобы два файла были сброшены последовательно, без блокировки?

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

Уловка заключается в том, что я хотел бы избежать блокировки I.E. делая fsync, как для латентности, так и для пропускной способности.

Любые идеи?

ответ

1

Я не думаю, что вы можете сделать это легко в одном пути выполнения. Вам нужно, чтобы fsync гарантировал запись на диск - и это нужно будет ждать записи.

Я подозреваю, что это возможно (но не просто), делегируя задачу написания отдельному потоку или процессу. Создайте данные в вашей существующей программе и «напишите» ее во второй поток/процесс, используя любой метод, который выглядит разумным. Это может быть неблокирование. Второй поток затем будет записывать любые новые данные в данные в ваш контент-файл, затем fsync, затем записывать индексный файл, а затем снова проверять новые данные. Основные решения по дизайну относятся к тому, как вы разделяете два пути выполнения, как вы общаетесь между ними, и если вам нужно сообщить о записи в основную программу. Это может все еще иметь проблемы с задержкой и пропускной способностью, но это часть затрат на выбор синхронизации файла индекса и содержимого. По крайней мере, у вас будет шанс получить работу во время ожидания на диске.

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

+0

Извините, по какой-то причине SO не сказал мне, что у меня был ответ, и до сих пор не помню этот вопрос. Это интересное решение, я думаю, что попробую. Это очень хорошо, так как у меня есть пул активов, которые иногда нужно синхронизировать с диском, и конструировать писательский поток для циклического объединения пула, блокировки и клонирования индекса, блокировки релиза, fsync-ресурса и последующей перезаписи индекса, звучит достаточно просто, спасибо! Я не знаю ни одной существующей базы данных, соответствующей моему использованию. «Объекты» - это капли от ~ 1 МБ -> 15 ГБ, требующие доступа в стиле pread(). – Rawler

 Смежные вопросы

  • Нет связанных вопросов^_^