来源 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. spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)

    本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...

  2. Windows7下MongoDB的下载、安装与配置详解

    一.Windows7下的运行库问题 虽然这个问题属于个例,但我觉得也有必要拿出来说说,保不齐你新装的系统就存在运行库没更新或者没装全的问题.出现这样的问题其实挺恼人的,具体表现就是系统经常会弹出警示框 ...

  3. 使用rdb文件进行redis数据迁移--python脚本

    查找了一些redis迁移的方法,一般做法就是 1. 从源数据库把rdb文件保存,然后传到新的主机上,启动新的redis即可 2. 把新的redis当做源数据库的slave,同步数据 今天开发提了一个测 ...

  4. vuejs基础-跑马灯效果

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  5. [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)

    [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP) 题面 有三个人从一张N个点无重边的有向无环图上的三个点出发,每单位时间,他们分别选择当前 ...

  6. k8s 组件介绍-kube-schedule

    kubernetes scheduler 基本原理 kubernetes scheduler 作为一个单独的进程部署在 master 节点上,它会 watch kube-apiserver 进程去发现 ...

  7. jar包 war包

    jar包和war包的区别: war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令 ...

  8. BFS+打印路径

    题目是给你起点sx,和终点gx:牛在起点可以进行下面两个操作: 步行:John花一分钟由任意点X移动到点X-1或点X+1. 瞬移:John花一分钟由任意点X移动到点2*X. 你要输出最短步数及打印路径 ...

  9. textarea实现高度自适应

    css部分 #textarea { display: block; margin:0 auto; overflow: hidden; width: 550px; font-size: 14px; he ...

  10. XMPP即时通讯协议使用(一)——Openfire安装

    Openfire服务器安装 下载地址:https://www.igniterealtime.org/downloads/index.jsp,根据你的操作系统,选择对应的下载版本.本文选择的是openf ...