У меня есть разреженный файл размером 1 ТБ, в котором фактически хранится 32 МБ данных в Linux.
Можно ли «эффективно» создать пакет для хранения разреженного файла? Пакет должен быть распакован в разреженный файл размером 1 ТБ на другом компьютере. В идеале «пакет» должен быть около 32 МБ.
Примечание. Возможным решением является использование tar: https://wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27
Однако для разреженного файла размером 1 ТБ, несмотря на то, что tar-шар может быть небольшим, архивирование разреженного файла займет слишком много времени.
Изменить 1
Я протестировал tar и gzip, и результаты следующие (обратите внимание, что этот разреженный файл содержит данные размером 0 байт).
$ du -hs sparse-1
0 sparse-1
$ ls -lha sparse-1
-rw-rw-r-- 1 user1 user1 1.0T 2012-11-03 11:17 sparse-1
$ time tar cSf sparse-1.tar sparse-1
real 96m19.847s
user 22m3.314s
sys 52m32.272s
$ time gzip sparse-1
real 200m18.714s
user 164m33.835s
sys 10m39.971s
$ ls -lha sparse-1*
-rw-rw-r-- 1 user1 user1 1018M 2012-11-03 11:17 sparse-1.gz
-rw-rw-r-- 1 user1 user1 10K 2012-11-06 23:13 sparse-1.tar
Файл sparse-1 размером 1 ТБ, содержащий 0 байт данных, может быть заархивирован с помощью «tar» в tar-шар размером 10 КБ или сжат с помощью gzip до файла размером ~ 1 ГБ. gzip занимает примерно в 2 раза больше времени, чем tar.
Из сравнения «tar» кажется лучше, чем gzip.
Однако 96 минут слишком много для разреженного файла, содержащего данные размером 0 байт.
Изменить 2
rsync
кажется, что копирование файла занимает больше времени, чем tar
, но меньше, чем gzip
:
$ time rsync --sparse sparse-1 sparse-1-copy
real 124m46.321s
user 107m15.084s
sys 83m8.323s
$ du -hs sparse-1-copy
4.0K sparse-1-copy
Следовательно, tar
+ cp
или scp
должно быть быстрее, чем непосредственно rsync
для этого чрезвычайно разреженного файла.
Изменить 3
Спасибо @mvp за указание на функциональность SEEK_HOLE в новом ядре. (Ранее я работал над ядром Linux версии 2.6.32).
Примечание. Требуется версия bsdtar >=3.0.4 (см. здесь: http://ask.fclose.com/4/how-to-efficiently-archive-a-very-large-sparse-file?show=299#c299 ).
В новом ядре и выпуске Fedora (17) tar
и cp
обрабатывают разреженный файл очень эффективно.
[zma@office tmp]$ ls -lh pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:14 pmem-1
[zma@office tmp]$ time tar cSf pmem-1.tar pmem-1
real 0m0.003s
user 0m0.003s
sys 0m0.000s
[zma@office tmp]$ time cp pmem-1 pmem-1-copy
real 0m0.020s
user 0m0.000s
sys 0m0.003s
[zma@office tmp]$ ls -lh pmem*
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:14 pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:15 pmem-1-copy
-rw-rw-r-- 1 zma zma 10K Nov 7 20:15 pmem-1.tar
[zma@office tmp]$ mkdir t
[zma@office tmp]$ cd t
[zma@office t]$ time tar xSf ../pmem-1.tar
real 0m0.003s
user 0m0.000s
sys 0m0.002s
[zma@office t]$ ls -lha
total 8.0K
drwxrwxr-x 2 zma zma 4.0K Nov 7 20:16 .
drwxrwxrwt. 35 root root 4.0K Nov 7 20:16 ..
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:14 pmem-1
Я использую ядро 3.6.5:
[zma@office t]$ uname -a
Linux office.zhiqiangma.com 3.6.5-1.fc17.x86_64 #1 SMP Wed Oct 31 19:37:18 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
gzip
илиbzip2
должны прекрасно сжимать его.pigz
иpbzip2
— их соответствующие современные эквиваленты, использующие все ядра. Вы будете приятно удивлены, как быстро они бегают. - person Marcin   schedule 06.11.2012