Эффективный способ записи нескольких файлов в один файл - PullRequest
0 голосов
/ 28 июля 2011

Есть n-количество файлов разного размера. Как мы могли бы эффективно добавить содержимое всех файлов в один файл?

Методы или алгоритм помогут? В основном я ожидаю, что эффективный метод достигнет этого на языке c.

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

Начните просто.Многопоточность привнесет значительную сложность и не обязательно заставит вещи работать быстрее.Время псевдокода:

Create a new file "dest" in write-only mode.
For each file "source" you want to append:
    Open "source" in read-only mode
    For each line "L" in "source":
        Write "L" to "dest"
    Close "source"
Close "dest"

Кстати, это очень просто (и почти оптимально) реализовать с помощью простых инструментов командной строки Linux (cat и т. Д.), Хотя это не так.Точно не переносится на Windows.Пример с одной строкой:

for i in `find . -type f -name "*.txt"`; do cat $i >> result.out; done

(Найти каждый .txt файл в текущем каталоге и добавить его к result.out.)

2 голосов
/ 28 июля 2011

Пройдите и найдите общий размер всех файлов.

Затем выделите выходной файл такого размера, снова просмотрите его и запишите данные в свой вывод.

1 голос
/ 28 июля 2011

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

zlib выглядит интересно: http://www.zlib.net/

0 голосов
/ 28 июля 2011
  1. получить размер Sn каждого файла и рассчитать общий размер T всех файлов
  2. создать файл dest
  3. использовать mmap для сопоставления файла dest с размером T, вы получите указатель P на начальный адрес области memmap
  4. mmap для каждого файла в mem и скопируете все данные в область выше по порядку.
  5. после этого вы получитефайл dest со всеми данными из всех файлов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...