来源 https://bbs.csdn.net/topics/390985048

分配一块大内存吧,要是一下申请不了64M那么大,就多申请几块小的,用个链表连起来。
用FileStream类的方法读取文件内容。

var
strList:TStringList;
begin
strList:=TStringList.Create;
strList.LoadFromFile('Filepath');//这样就读到内存中,保存在变量strList中了,要用的时候可以用strList.text取出
end;

文件流、

var
mStream: TMemoryStream;
begin
mStream := TMemoryStream.Create;
mStream.LoadFromFile('c:\temp\test.txt'); {把文件读入内存流}
Memo1.Lines.LoadFromStream(mStream); {把内存流载入 Memo1}

用内存映射最好,TMemoryStream坑爹呢,整个64M到内存去?要是上G文件也这样整?TFileStream比较慢,内存映射最快,大致是CreateFile获得文件句柄,再 CreateFileMapping 创建映射 ,然后根据大小一块一块MapViewOfFile ,得到的内存地址可以直接访问,效率绝对可以。

PShareMem = ^TShareMem;
TShareMem = Record
id:string[];
name:string[];
age:Integer;
end; shareMemName:string; //共享内存名
fileHandle : THandle;//内存映射文件句柄
pUserInfoShareMem : PShareMem;//指向共享内存的指针 begin
//创建“内存映射文件”
fileHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, , SizeOf(TShareMem), PChar(shareMemName));
if fileHandle <> then
begin
Self.Memo1.Lines.Add('已成功创建内存映射文件!');
end;
end; //将“内存映射文件”与“应用程序地址空间”建立映射关系
pUserInfoShareMem:=MapViewOfFile(fileHandle,FILE_MAP_ALL_ACCESS,,,sizeof(TShareMem));
if pUserInfoShareMem <> nil then
begin
Self.Memo1.Lines.Add('已成功建立映射关系!');
end; pUserInfoShareMem.id:='';
pUserInfoShareMem.name:='Terry';
pUserInfoShareMem.age:=;
Self.Memo1.Lines.Add('已向共享内存中写入用户信息!'); //解除“内存映射文件”与“应用程序地址空间”的映射关系
if pUserInfoShareMem<> nil then
UnmapViewOfFile(pUserInfoShareMem);
Self.Memo1.Lines.Add('已成功解除映射关系!'); //关闭内存映射文件
if fileHandle<> then
CloseHandle(fileHandle);
Self.Memo1.Lines.Add('已成功关闭内存映射文件!');

用内存映射吧, 64G读进来都不成问题

function FastReadFile(FileName: string): Integer;
const
PAGE_SIZE = * ; //映射块大小不易过大,尽量以4k对齐
var
hFile: THandle;
szHigh,szLow: DWORD;
szFile,ps: Int64;
hMap: THandle;
hData: Pointer;
dwSize: Cardinal;
begin
Result := -;
hFile := ;
hMap := ;
hData := nil;
szHigh := ;
try
//打开已存在的文件,获得文件句柄
hFile := CreateFile(PChar(FileName),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,
nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,);
if hFile = then
begin
Result := GetLastError;
Exit;
end;
//获取文件大小
hMap := ;
hData := nil;
szHigh := ;
szLow := GetFileSize(hFile,@szHigh);
szFile := szLow or (szHigh shl );
//创建映射句柄
hMap := CreateFileMapping(hFile, nil, PAGE_READWRITE, szHigh, szLow, nil);
if hMap = then
begin
Result := GetLastError;
Exit;
end;
ps := ;
//文件可能比较大,分块进行映射
while ps < szFile do
begin
//计算映射大小及位置
if szFile - ps > PAGE_SIZE then
dwSize := PAGE_SIZE
else
dwSize := szFile - ps;
szLow := ps and $FFFFFFFF;
szHigh := ps shr ;
//进行映射
hData := MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,szHigh,szLow,dwSize);
if hData = nil then
Break;
try
//此时文件偏移ps处的数据通过hData即可读取到,块大小为dwSize
//以下加上你读取的代码,可以做一个回调函数
//比如你要当前位置的数据(取文件数)拷到指定内存处 CopyMemory(目标地址指针,hData,dwSize);
// finally
//移动文件偏移位置
ps := ps + dwSize;
//释放映射块
UnmapViewOfFile(hData);
hData := nil;
end;
end;
finally
//释放必要资源
if hData <> nil then
UnmapViewOfFile(hData);
if hMap <> then
CloseHandle(hMap);
if hFile <> then
CloseHandle(hFile);
end;
end;

C# 读取大文件至内存

long offest = ;
byte[] buffer = null;
try
{
using (FileStream fs = new FileStream(fileFullPath, FileMode.Open))
{
buffer = new byte[ * ];
while ((offest + * ) <= fs.Length)
{
fs.Read(buffer, , buffer.Length);
offest += * ;
fs.Seek(offest, SeekOrigin.Begin);
} if ((fs.Length - offest) < * )
{
fs.Read(buffer, , Convert.ToInt32(fs.Length - offest));
MessageBox.Show("Done");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

因为计算机的内存空间是有限的,如果一次性把大数据文件加载至内存,会造成内存极速被消耗。此举不适合一般情况的读取大数据文件。
C#提供了FileStream类来操作文件流,可以和Seek()函数一起循环读取文件中特定长度的数据(比如1M),这样不会造成内存浪费,也符合软件开发的基本逻辑。

delphi中如何将一整个文件读入内存的更多相关文章

  1. C一次将整个文件读入内存

    最近工作,有个需求需要将YUV的整个文件读入内存,然后处理这些YUV数据,一种比较有效的方法如下: #include <stdio.h> #include <stdlib.h> ...

  2. 转 Delphi中使用FastMM4结合View CPU避免内存泄漏

    http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html 核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下, ...

  3. Delphi中编辑word

      其他(28)   //启动Word   try     wordapplication1.connect;   except     messagedlg('word may not be ins ...

  4. Delphi中堆栈区别

     http://blog.csdn.net/zang141588761/article/details/52838728 Delphi中堆栈区别 2016-10-17 14:49 277人阅读 评论( ...

  5. delphi中的各种文件类型介绍【转】

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  6. 在delphi的exe文件中嵌入另外一个exe文件

    http://www.cnblogs.com/dabiao/archive/2009/11/28/delphi.html 1.创建rc文件.可以用任意文本编辑器来写.文件格式为:"资源名 资 ...

  7. delphi中的各种文件类型介绍

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  8. delphi中单独编译pas生成dcu文件

    delphi中单独编译pas生成dcu文件 在网上下载了一个带源码的组件,结果碰到提示说缺少xxx.dcu.一看它的目录下确实没有,那能不能生成一个呢? 当然可以! 方法是使用delphi的安装目录\ ...

  9. 在Delphi中通过OLE方式写Excel文件

    报表的打印是每个项目都会遇到的问题.由于报表格式要求五花八门,往往又同时要求打印格式可方便调整.作为一种替代方法,可以将需要打印的报表导出到Excel/Word,打印交给Office去吧.由于Offi ...

随机推荐

  1. day37—javascript对表格table的操作应用(二)

    转行学开发,代码100天——2018-04-22 昨天学习了JavaScript对table的基本操作,包括表格的创建,表格元素的获取,隔行换色及鼠标动作等.今天主要学习table的搜索查询及排序操作 ...

  2. Ubuntu12.04安装MariaDB并修改字符集为UTF-8

    其实按照MariaDB官网的步骤来安装MariaDB特别的简单,只要按照步骤来做,很容易就搞定了. 首先,到MariaDB官网: https://downloads.mariadb.org/maria ...

  3. Hibernate使用时需要注意的几个小问题

    今天晚上玩了一下JDBC连接数据库,之后又利用Hibernate进行了数据库的访问,感觉利用Hibernate对数据库访问在文件配置好了之后确实更加简单快捷. 但是在操作的过程中也有一些细节需要注意一 ...

  4. Vue对象的生命周期

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 状压BFS

    ​题意:1个机器人找几个垃圾,求出最短路径. 状压BFS,这道题不能用普通BFS二维vis标记数组去标记走过的路径,因为这题是可以往回走的,而且你也不能只记录垃圾的数量就可以了,因为它有可能重复走同一 ...

  6. qt 如何使用私有类?

    在模块后面加上 -private 关键字,例如 widgets-private 然后 qmake 让配置文件运行一下. 在使用 QStackedLayout 布局并设置 QStackedLayout: ...

  7. MySQL的数据类型:文本、数字、日期/时间

    在MySQL中,有三种主要的类型:文本.数字和日期/时间类型. 文本类型(text):数据类型                                 描述 CHAR(size) 保存固定长度 ...

  8. 重置zend studio 默认设置的方法[转]

    这个方法类似于手机的“恢复出厂设置”的功能,就是将所有的使用记录全部清除,用于解决zend studio使用过程中遇到的各种莫名其妙的问题,可以说是zend studio各种问题的终极解决方法~能够解 ...

  9. 关于linux的日志

    日志的三种类型# 内核及系统日志: 这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置.系统中有相当 ...

  10. https://blog.csdn.net/eguid_1/article/category/6270094

    https://blog.csdn.net/eguid_1/article/category/6270094