2013-06-07 5 views
2

Мне нужно создать большой файл (несколько гбайт) в/dev/shm. который является RAMdisk на машинах Linux. Это должно быть как можно быстрее. В настоящее время я использую 5 отдельных потоков POSIX в C для создания последовательных сегментов 100 мегабайт, тогда у меня есть другой поток, который объединяет их в основной выходной файл.Создание большого файла в/dev/shm параллельно: производительность

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

ответ

3

Самый быстрый способ сделать это - просто позвонить truncate() или ftruncate(), чтобы развернуть файл до требуемого размера.

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

+0

Я пробовал это, и это может сработать. Но я смог «создать» файлы, которые были больше, чем содержащая их файловая система. Так или иначе, это не кажется правильным. –

+0

Итак, основная идея такова: во-первых, используйте truncate для создания огромного файла, затем каждый поток использует lseek() для перемещения вперед к своему месту в файле, затем этот поток записывает данные там? Это правильно? –

+0

Хорошо. ММАП(). Не думал об этом. –

2

Просто откройте файл один раз для каждой нити, lseek в положение, в котором начинается поток, и write нормально. Или вы можете использовать pwrite, чтобы указать местоположение записи; в этом случае один открытый может быть разделен всеми потоками, так как им не нужно использовать текущую позицию файла.

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

+0

Спасибо. Я попробую это. –