Оптимальный способ собрать файл - PullRequest
0 голосов
/ 12 февраля 2009

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

, например

1.tgz.1  1.tgz.2  1.tgz.3   =========> 1.tgz

Ответы [ 4 ]

8 голосов
/ 12 февраля 2009

Вы можете объединить файлы из оболочки.

В Windows (/b для двоичного режима):

copy /b   1.tgz.1 + 1.tgz.2 + 1.tgz.3   1.tgz

В Unix / Linux:

cat   1.tgz.1 1.tgz.2 1.tgz.3   > 1.tgz
2 голосов
/ 12 февраля 2009

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

Поскольку большинство оболочек UNIX расширяют символы подстановки в алфавитном порядке, вы должны использовать:

cat 1.tgz.? 1.tgz.?? 1.tgz.??? >1.tgz

Предполагается, что существует от 100 до 999 файлов включительно, отрегулируйте аргументы для обработки более или менее (например, добавьте 1.tgz. ????, если между 1000 и 9,9999 включительно). Вы не достигнете лучшей производительности, поскольку ваша узкая местность - это скорость диска, которая всегда будет медленнее, чем код, работающий на CPU.

Единственные другие возможности, о которых я могу подумать:

  • создать 1.tgz на отдельном физическом диске. Это может дать вам преимущество чередования обращений к диску.
  • запустите от имени пользователя root и используйте nice для увеличения вашего приоритета (подробности см. man nice). Это повысит вашу мощность и увеличит нагрузку на процессор, но опять же, если вы связаны с дисковым вводом / выводом, это не сильно поможет.
0 голосов
/ 12 февраля 2009

Вероятно, вы получите лучшую производительность, используя dd с большим размером блока:

for n in *.tgz.* ; \
  dd if="$n" conv=notrunc oflag=append bs=4M of="somefile.tgz" ; \
done
0 голосов
/ 12 февраля 2009

Это bash (ваша оболочка может отличаться):

for n in *.tgz.* ; do cat $n >> ${n/tgz.*/tgz} ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...