Help with Out Of Memory D v1.0

jose isaias cabrera cabrera at wrc.xerox.com
Tue Dec 18 11:37:01 PST 2012


----- Original Message ----- 

>
> Greetings!
>
> I have this program that zips a file and everything works perfectly, if 
> the files are small enough.  But, I am having to zip files that are 
> getting more and more extreme in size and I am running out of memory. 
> Here is the output when executing a small program to zip a folder:
>
> 0:36:59.76>zipafile
> Zipping file no 0 huge\0.pdf
> ** PLEASE WAIT FOR FILE #0 TO BE ZIPPED **
> Zipping file no 1 huge\1.exe
> ** PLEASE WAIT FOR FILE #1 TO BE ZIPPED **
> Zipping file no 2 huge\2.exe
> ** PLEASE WAIT FOR FILE #2 TO BE ZIPPED **
> Zipping file no 3 huge\updates\p.zip
> ** PLEASE WAIT FOR FILE #3 TO BE ZIPPED **
> Zipping file no 4 huge\updates\q.html
> ** PLEASE WAIT FOR FILE #4 TO BE ZIPPED **
> Zipping file no 5 huge\updates\z.exe
> ** PLEASE WAIT FOR FILE #5 TO BE ZIPPED **
> finished all files...
> ** PLEASE WAIT FOR ZIP FILE TO BE CREATED **
> Error: Out of memory
>
> 0:37:56.26>
>
> This is the program in question...
>
> import std.stdio;
> import std.file;
> import std.date;
> import std.zip;
> import std.zlib;
> import jic.libs.MyFile;
>
> int main(char[][] args)
> {
>
>  char[] folder = r"c:\tmp\huge";
>  ZipAFolder(folder);
>  return 0;
> }
>
> void ZipAFolder(char[] zipFolder)
> {
>  char[] fdname = std.path.getDirName(zipFolder);
>  char[][] allfiles = std.file.listdir(zipFolder,"*");
>  char[] zipFile = zipFolder ~ ".zip";
>  int FilesCnt = 0;
>
>  std.zip.ZipArchive zr;
>  zr = new std.zip.ZipArchive();
>  int one = 0;
>  foreach(char[] f; allfiles)
>  {
>    char[] f0 = std.string.replace(f,fdname ~ "\\","");  // Filename
>    writefln("Zipping file no " ~ std.string.toString(one) ~ " " ~ f0);
>
>    ArchiveMember am = new ArchiveMember();
>    am.compressionMethod = 8;
>    am.name = f0;
>    //am.expandedData = cast(ubyte[]) f.read();
>    am.expandedData = cast(ubyte[]) f.read();
>    am.expandedSize = am.expandedData.length;
>    FileData fd0 = GetFileInfo(f);
>    long usedT0;
>    if (fd0.creationTime > fd0.modifiedTime)
>    {
>      usedT0 = fd0.creationTime;
>    }
>    else
>    {
>      usedT0 = fd0.modifiedTime;
>    }
>    am.time = std.date.toDosFileTime(usedT0);
>    zr.addMember(am);
>    writefln(" ** PLEASE WAIT FOR FILE #" ~ std.string.toString(one) ~ " TO 
> BE ZIPPED ** ");
>
>    one++;
>  }
>  writefln("finished all files...");
>  writefln(" ** PLEASE WAIT FOR ZIP FILE TO BE CREATED ** ");
>  std.file.write(zipFile, cast(byte[])zr.build());
>  writefln(" ** " ~ std.string.toString(one) ~ " FILES ZIPPED ** ");
>  writefln(zipFile ~ " created.");
>  //return 1;
> }
>
> As you can see, the last two writelns do not get printed because of the 
> Out Of Memory.  Any help would be greatly appreciated.  Thanks.
>
> josé

So, can anyone help suggesting how to change this line,

std.file.write(zipFile, cast(byte[])zr.build());

so that do not get the out of memory?  I tried a few things, but I can not 
compile it.  Thanks so much.

josé 



More information about the Digitalmars-d-learn mailing list