From: Craig B. <cr...@at...> - 2002-06-19 20:27:58
|
> Also, I've a more technical question, Archive::Zip provides ReadChunk, > but not WriteChunk, so when making zipping a file, I must use a temporary > variable, which is not elegant/optimal: > > my($data, $size, $content); > while ( $f->read(\$data, $BufSize) > 0 ) { > $content .= $data; > $size += length($data); > } > $f->close; > $zipmember = Archive::Zip::Member->newFromString($content, $hdr->{name}); > Like you wrote in FileZIO.pm, this can cause the program to ran out of > memory. Once again, if someone knows a better solution, please let me know. The situation is even worse than this: Archive::Zip saves all the file contents (from newFromString()) in memory and only writes it out when you do writeToFileHandle(). The solution I implemented for BackupPC_zipCreate in 1.5.0alpha4 was to subclass Archive::Zip::FileMember. That way you can add files to the zip object, but only the path needs to be stored. When you later call writeToFileHandle(), each file is opened by BackupPC::Zip::FileMember and BackupPC::FileZIO is used to uncompress the file in modest chunks as needed. So the total memory usage is much more reasonable. Craig |