我目前正在尝试重写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之间,这取决于您的操作系统以及您是否使进程具有大地址意识。找到整整千兆字节的连续地址空间将是一件棘手的事情。
解决无法找到连续地址空间块的问题的方法是停止尝试这样做。不要一次将整个文件读入内存。逐个读取文件,处理较小的块。