VirtualAlloc-为大文件分配空间



我目前正在尝试重写Binary Diff以支持更大的文件,因为使用GetMem读取文件会限制文件大小(我想),并且我无法读取两个大小为900 MB的文件。

所以我想,我可以使用VirtualAlloc,但遗憾的是,它还没有很好地发挥作用。从外观上看,第一个文件的分配很好——一旦我试图为第二个文件分配内存,它就会返回一个空指针。不得不说,我对分配内存还很陌生,所以如果我监督了一个已经回答这个问题的线程,请原谅我(过去4个小时我在互联网上搜索了一个解决方案)。

好吧,这是代码:

procedure TFileData.LoadFile;
var
  FileHandle: Integer;
  BytesRead: Integer;
  dataPoint : Pointer;
begin
  FileHandle := FileOpen(fName, fmOpenRead or fmShareDenyWrite);
  try
    if FileHandle = -1 then
      Error('Cannot open file %s', [fName]);
    fSize := GetFileSize(FileHandle, nil);
    if fSize = Cardinal(-1) then
      Error('Cannot find size of file %s - may be to large', [fName]);
    if fSize = 0 then
      Error('File %s is empty', [fName]);
     try
        dataPoint := VirtualAlloc(nil,fSize,MEM_COMMIT,PAGE_READWRITE);
        fData := dataPoint;
        BytesRead := FileRead(FileHandle, fData^, fSize);
        if BytesRead = -1 then
          Error('Cannot read from file %s', [fName]);
        if fSize <> Cardinal(BytesRead) then
          Error('Error reading from file %s', [fName]);
     except
      if Assigned(fData) then
        FreeMem(fData, fSize);
      raise;
    end;
  finally
    if FileHandle <> -1 then
      FileClose(FileHandle);
  end;
end;

最后,我想用这个程序来比较两个任意大小的非文本文件,并从中创建一个Binary Diff。

VirtualAlloc没有帮助。对于这么大的内存块,您对GetMem的调用将被实现为对VirtualAlloc的调用。当然,您的VirtualAlloc代码完全错误也于事无补。将CCD_ 7与CCD_。然而,由于VirtualAlloc不是答案,我就不详细讨论了。

真正的问题是,您的32位进程的地址空间在2GB到4GB之间,这取决于您的操作系统以及您是否使进程具有大地址意识。找到整整千兆字节的连续地址空间将是一件棘手的事情。

解决无法找到连续地址空间块的问题的方法是停止尝试这样做。不要一次将整个文件读入内存。逐个读取文件,处理较小的块。

相关内容

  • 没有找到相关文章

最新更新