DELPHI 内存流修改16进制文件, 文件太大时候OutofMemory的问题研究

本文探讨了使用DELPHI内存流修改大型16进制文件时遇到的OutofMemory问题,并提出了解决方案。通过固定长度的字节数组手动管理内存,避免了自动内存分配导致的内存不连续问题。

DELPHI 内存流修改16进制文件, 文件太大时候OutofMemory的问题研究

问题描述:
需要用内存流打开一个300M大小的文件, 替换文件中固定长度的16进制编码为另一条编码

原始思路
1、用TMemoryStream 读取文件后,保存为TBytes 字节数组,
2、开辟一个新TBytes字节数组,讲原始数据与替换数据逐步写入新数组

问题表现:

在Length(新数组) 开辟内存空间时候, 文件超过100m 就会报OutofMemory 错误, 小于100m 一切顺利

尝试取消新数组,用TMemoryStream 新建一内存流逐步写入新文件数据,问题依旧。

研究问题产生原因:

数组setlength 和TMemoryStream .write,都需要在内存开辟一个连续的内存空间。

TMemoryStream 中不断写入数据的时候, TMemoryStream是 自动增加空间 和 自己setLength(新数组) 开辟内存空间的做法机制相同。
都是试图开辟一个给予当前buff能连续的内存空间。
虽然内存足够,但是当无法开辟了连续内存空间时候就会出错。
当内存开辟比较小的时候一般不会有问题,但是当一次开辟较大内存的时候 就可能产生内存不连续的,无法开辟内存空间的问题

解决办法。
由于修改文件,造成的文件大小变化不会超过10m
取消根据写入发现内存不足时候的自动开辟内存, 改为以原始文件大小+10M的,初始开辟一个固定长度byte数组。
在分批写入的时候 改为手动管理实际数据的数组长度。

最后用TMemoryStream 提取数组中实际数据长度来写入。

其他情况
C#中在开辟内存也有类似的情况

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值