【问题标题】:VirtualAlloc - allocating space for big filesVirtualAlloc - 为大文件分配空间
【发布时间】:2015-05-02 22:33:15
【问题描述】:

我目前正在尝试重写 Binary Diff 以支持更大的文件,因为使用 GetMem 读取文件会限制文件大小(我想)并且我无法读取 2 个每个大小为 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。

【问题讨论】:

  • 谢谢,我会试一试的。
  • 内存映射不是万能的。如果您尝试映射整个文件的视图,您将遇到完全相同的问题。内存映射可能是一个有用的工具,但为了取得进展,您需要重新考虑您的算法。尝试使用不同的 API 实现您当前的算法无济于事。

标签: delphi delphi-xe6 virtualalloc


【解决方案1】:

VirtualAlloc 无济于事。您对GetMem 的这么大内存块的调用将被实现为对VirtualAlloc 的调用。当然,您的VirtualAlloc 代码全错也无济于事。将VirtualAllocFreeMem 匹配真的一点都不好。不过,由于VirtualAlloc 不是答案,所以我不会详述。

您真正的问题是您的 32 位进程的地址空间在 2GB 到 4GB 之间,具体取决于您的操作系统以及您是否让进程具有大地址感知能力。找到整 GB 的连续地址空间将是一件棘手的事情。

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

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 2014-05-22
    • 2017-05-24
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2014-03-09
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多