$crc = hash('md5', $content, true);
if (!isset($this->catalog[$crc . $stat['size']])) { // Если нет такого блока, то сохраняем
Плакала моя коллекция md5-коллизий :-(
А если серьёзно, по-моему дьявол-то в деталях. Остальные форматы показывают результаты хуже, потому что им-то еще разжать может потребоваться, а не только посчитать.
Корректнее было бы сравнивать не с ZIP и RAR, а с TAR.GZ, ведь вы по сути его и придумали.
Прогнал tar -z и sxb_test на двух вариантах — один синтетический: 10 мб /dev/urandom + симлинк на него, второй — wwwroot сайта размером в гиг.
На обоих тестах tar выиграл
А именно...
## Первый тест
vos@ctfsu ~/t/sxbtest $ dd if=/dev/urandom of=testfile bs=10M count=1
vos@ctfsu ~/t/sxbtest $ ln -s testfile link
vos@ctfsu ~/t/sxbtest $ time php sxb_test.php
<source lang="php">
dirs 0
files 3
full_size 20.004
dup_size 10
archive_size 10.005
duplicates 320
bigfiles 2
bf_blocks 640
bf_dup 320
bf_size 20
bf_dup_size 10
time 0.6723
</source>
real 0m0.737s
user 0m0.628s
sys 0m0.104s
vos@ctfsu ~/t $ time rar a test.rar sxbtest
<...>
real 0m16.094s
user 0m15.481s
sys 0m0.400s
vos@ctfsu ~/t $ time zip -r test.zip sxbtest
<...>
real 0m1.069s
user 0m0.908s
sys 0m0.132s
vos@ctfsu ~/t $ time tar czvf test.tar.gz sxbtest
<...>
real 0m0.643s
user 0m0.492s
sys 0m0.120s
vos@ctfsu ~/t $ ls -la
-rw-r--r-- 1 vos vos 21027433 Jan 16 13:51 test.rar
-rw-r--r-- 1 vos vos 10490797 Jan 16 13:50 test.sxb
-rw-r--r-- 1 vos vos 10489462 Jan 16 13:51 test.tar.gz
-rw-r--r-- 1 vos vos 20976774 Jan 16 13:51 test.zip
# Можно заметить, что RAR и ZIP честно "сжали" оба файла - и реальный, и симлинк.
# SXB схавал симлинк благодаря дедупликации, а TAR - благодаря поддержке симлинков ;)
# При этом TAR сработал на 100 мсек быстрее, и архив получился чуть меньше
## Второй тест
root@zenyro /var/www/zenyro # du -s .
1015580 .
root@zenyro /var/www/zenyro # time php sxb_test.php
<source lang="php">
dirs 77
files 1038
full_size 987.905
dup_size 0.46
archive_size 935.769
duplicates 175
bigfiles 146
bf_blocks 31505
bf_dup 13
bf_size 982.087
bf_dup_size 0.385
time 114.39332
</source>
real 1m54.616s
user 1m6.716s
sys 0m3.700s
root@zenyro /var/www # time tar czvf test.tar.gz zenyro
<...>
real 1m4.614s
user 0m56.044s
sys 0m3.380s
root@zenyro /var/www # ls -la
-rw-r--r-- 1 root root 981224934 2013-01-16 13:57 test.sxb
-rw-r--r-- 1 root root 980944407 2013-01-16 13:59 test.tar.gz
# Снова TAR чуть меньше, и быстрее на 10 секунд
# Не говоря уже о том что его можно распаковать :)
И еще
Глупая мысль о том, как спасти мир и не изобрести велосипед
По сути, придуманный вами формат ближе всего к TAR с навешанным GZ, поэтому имхо стоит просто взять формат TAR за основу и прикрутить к нему недостающие фишки.
Во-первых, его стоит взять потому что он изначально заточен под никсы, и в нем уже есть все что нужно для полноценного бекапа сервера. В вашем формате пришлось бы учитывать тонну нюансов, по типу симлинков, прав к файлам и тд.
Во-вторых, сам формат tar супер-легкий для понимания и реализации, писать архивы в виде TAR-а легче чем выдумывать свой велосипед со всеми фичами, которые вы перечислили, и при этом тарник можно будет распаковать где угодно. К тому же, я слабо представляю как вы собираетесь совместить некоторые фичи, например «Непрерывный архив» и «Наличие индекса + Быстрый случайный доступ к содержимому»
А вот если добавить в TAR то, чего ему не хватает, вполне может получиться крутое решение. Например, если реализовать в вашем скрипте «Сохранение потоков в архив» для TARа, это легко может стать «киллер-фичей». И это по сложности ничем не отличается от сохранения потоков в своем велосипедном формате. Ну или тот же «Контроль целостности содержимого» в виде файлика в md5-суммами файлов внутри архива. Главное, чтобы не ломалась спецификация и получившийся архив можно было распаковать без вашей тулзы.
С другой стороны, раздражает, когда аппликуха показывает «картинку похожую на первый экран», на которой нельзя ничего ткнуть потому что сама аппликуха еще прогружается.
В SQLite базе хранится только то, что видно в чате, а вот в лежащей рядом папке chatsync/ можно найти полную историю сообщений в бинарном скайповском формате, включая текст всех правок и стертых мессаг.
Более того, даже если собеседник написал что-то вам в оффлайн, а потом удалил, когда вы зайдете в skype его исходное сообщение все равно попадет в chatsync.
Еще простой способ, основанный на отрезании пробелов MediaWiki: http://lurkmore.to/Конопля_
(«дудку» переименовали в «коноплю», но на последнюю в итоге тоже повесили плашку)
Плакала моя коллекция md5-коллизий :-(
А если серьёзно, по-моему дьявол-то в деталях. Остальные форматы показывают результаты хуже, потому что им-то еще разжать может потребоваться, а не только посчитать.
Корректнее было бы сравнивать не с ZIP и RAR, а с TAR.GZ, ведь вы по сути его и придумали.
Прогнал tar -z и sxb_test на двух вариантах — один синтетический: 10 мб /dev/urandom + симлинк на него, второй — wwwroot сайта размером в гиг.
На обоих тестах tar выиграл
И еще
Во-первых, его стоит взять потому что он изначально заточен под никсы, и в нем уже есть все что нужно для полноценного бекапа сервера. В вашем формате пришлось бы учитывать тонну нюансов, по типу симлинков, прав к файлам и тд.
Во-вторых, сам формат tar супер-легкий для понимания и реализации, писать архивы в виде TAR-а легче чем выдумывать свой велосипед со всеми фичами, которые вы перечислили, и при этом тарник можно будет распаковать где угодно. К тому же, я слабо представляю как вы собираетесь совместить некоторые фичи, например «Непрерывный архив» и «Наличие индекса + Быстрый случайный доступ к содержимому»
А вот если добавить в TAR то, чего ему не хватает, вполне может получиться крутое решение. Например, если реализовать в вашем скрипте «Сохранение потоков в архив» для TARа, это легко может стать «киллер-фичей». И это по сложности ничем не отличается от сохранения потоков в своем велосипедном формате. Ну или тот же «Контроль целостности содержимого» в виде файлика в md5-суммами файлов внутри архива. Главное, чтобы не ломалась спецификация и получившийся архив можно было распаковать без вашей тулзы.
Ладно, чёт я увлекся :) Заинтересовал ваш подход!
Желаю вам следования имеющимся спецификациям =)
Раскурите? :)
Кодировка — cp1251
А, ну понятно.
Более того, даже если собеседник написал что-то вам в оффлайн, а потом удалил, когда вы зайдете в skype его исходное сообщение все равно попадет в chatsync.
http://lurkmore.to/Конопля_
(«дудку» переименовали в «коноплю», но на последнюю в итоге тоже повесили плашку)
Более того, перенаправления STDERR и тп тоже работают как надо:
Осталось в заначке 11 кодов от австралийского VodaFone.
Готов раздать, пишите