Записать несколько потоков в один файл, не зная длины потоков? - PullRequest
0 голосов
/ 07 сентября 2011

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

Поскольку каждое подмножество будет иметь неизвестный размер после сжатия, нет способа узнать, в какое байтовое смещение записывать.Без сжатия каждый писатель может записывать на предсказуемый адрес.

Есть ли способ добавлять файлы вместе на уровне файловой системы, не требуя копирования файла?

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

single-dataset.raw
[header 512B][data1-45MB][data2-123MB][data3-4MB][data5-44MB] 

Я ожидаю, что SAN пока будет NTFS на случай, если будут какие-то особые функции определенных файловых систем.

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

1 Ответ

0 голосов
/ 07 сентября 2011

Использовать разреженные файлы.Просто расположите каждое подмножество с некоторым смещением, «гарантированно» выходящим за пределы последнего подмножества.Ваш заголовок может содержать смещение каждого подмножества, а файловая система обрабатывает для вас большие «пустые» чанки.

Более холодное решение - выписать каждое подмножество в виде отдельного файла, а затем использовать функции файловой системы низкого уровняобъединить файлы, связав первый блок следующего файла с последним блоком предыдущего файла (вместе с удалением записей каталога для всех файлов, кроме первого).

...