zlib ?

6 отговора 117 прегледа
#1

zlib ?

Здравейте.

Дадох си едно домашно и си сложих таралеж в гащите.

Та задачата е - има голям текстов файл, който да се архивира като zip и след това да се разархивира. И давата файла не могат да се заредят целите в паметта.

Четох дебели книги, но всички примери искат всичко в паметта. Пробвах на парчета, но не успях.

Знае ли някой място, откъдето да взема малко акъл по този въррос.

Благодаря предварително.

И най-ярките личности си плащат тока.
Отговор
в отговор на edembg #2

Re: zlib ?

каква грешка ти дава ? да не е таймаут?

-----------------------
гърбавия, ковчег ще го изправи
Отговор
в отговор на Bълk #3

Re: zlib ?

gzuncompress - data error.

gzinflate - buffer error.

Оставам с впечатление, че ако не е компресирано всичко наведнаж, не може да се разархивира.

Най голям успех имах с gzwrite, но го познава са мо readgzfile, което пак вдига всичко разархивирано в паметта.

И понеже не съм много добре с архивите ми трябва от някъде да се ограмотя.

И най-ярките личности си плащат тока.
Отговор
в отговор на edembg #4

Re: zlib ?

Има един такъв пиниз, че при архивирането основна роля играе статистическата информация, която може да се събере. Коя е най-често срещаната буква, коя е тази след нея и т.н. Обаче мисля, че в случая със zlib нямаш проблеми да го караш и на порции...

Everything louder than everything else...
Отговор
в отговор на edembg #5

Re: zlib ?

За пробата направих това :

$file = "./very_long_file.txt";
$gzfile = "./very_long_file.txt.gz";
$fp = fopen($file, "r");
echo $file."OPened\n";
$zp = gzopen($gzfile, "w9");
echo $gzfile."OPened\n";
while (!FEOF($fp)){
$data = fread ($fp, 1048576);
echo ".";
gzwrite($zp, $data);
}
gzclose($zp);
fclose($fp);

Файла ми беше 70 Мб и мина без проблем. Може да го пробвам и с по-голям но ще видим :-))))))

Имай предвид, че ако го изпълняваш през браузър задължително си пускай някакъв аутпут за да не ти прави retry-ове, че ще скапе хостинга :-))))

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Отговор
в отговор на ro6avia #6

Re: zlib ?

Подобна проба правих и аз.

Но при разархивирането gzread чете целият архив и го връща в array. В книгата пише, че мога да задавам дължина на прочетените данни, но при мен не обръщаше внимание на това.

Моятя проба беше с 240k текст. При разархивирането исках да ми чете по 1к, но прочете всичко наведнаж. Иначе тази схема ми е много удобна.

В твоят пример 70Mb трябва да се заредят в паметта, а PHP има доста по-малък лимит за скрипта (PHP4.06 - 8Мb).

Благодаря. Ще пробвам с нещо по-голямо. Може би ще стане.

И най-ярките личности си плащат тока.
Отговор
в отговор на Dakota #7

Re: zlib ?

На порции не ще. Пробвах с gzcompress на части и след това ги залепвах една за друга. При gzuncompress дава data error. Явно така му се "разместват битовете" и алгоритъма на разархивирането се побърква.

Благодаря. В краен случай ще го направя като zip с много файлове, всеки от които е достатъчно малък и няма да задръсти паметта.

И най-ярките личности си плащат тока.
Отговор