C# 读取大文件~急

jglie 2011-08-27 10:04:15
最近一直在搞文件(cap格式)的读取解析,程序在解析大文件时就挂了。。。
目前我的程序500M以下的文件可以正常读取解析。速度和性能还可以接受(200M 耗时20S左右)。但500M以上的话,内存增长导致内存溢出的问题。使的我很郁闷,始终没解决。在此向各位高手请教~~大家一起来学习。

程序中我使用了:分块解析一个大文件和多线程。之前查过有别人说用到“内存映射”技术。本人刚接触C#,对那个技术还不了解。希望各位歌手指点!!!
...全文
419 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hwbox 2011-08-31
  • 打赏
  • 举报
回复
用文件位图解决不了么?或者你的程序就是要求一次性入内存?
sdl2005lyx 2011-08-31
  • 打赏
  • 举报
回复
“cap”是什么格式的文件?“在读取1G以上的文件时,内存和数据如何申请和保存呢”,
的确,通常的做法都是完整读入内存,再进行解析,这里我提供一个思路:

XmlReader 类 ,听说过吧,它就是为解决XmlDocument读大的xml文件,须一次性读入内存带来的副作用而产生的。它不需要一次性读入,提供 XML 数据进行快速、非缓存、只进访问的读取器,每次读入一个节点,由应用来决定解析!

楼主,你可以通过反射器看看XmlReader 的Read函数如何实现的,理解后,写出自己的cap流模式解析类。
ycproc 2011-08-27
  • 打赏
  • 举报
回复
这个要看怎么具体的情况 了
也许转化的时间都又浪费了
jglie 2011-08-27
  • 打赏
  • 举报
回复
下面是我读文件的代码

private const int bufferSize = 1024 * 1000; // 定义每次读取文件大小为 1024 * 100=10M
private void SplitPacketParse()
{
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
byte[] ReadArray = new byte[bufferSize];
byte[] HeaderData = new byte[24];

fileStream.Read(HeaderData, 0, 24);
int incnum = fileStream.Read(ReadArray, 0, bufferSize);

while( incnum > 0)
{

ParseOff(); //
......
// 再此读文件
incnum = fileStream.Read(ReadArray, 0, bufferSize);
}
fileStream.Close();
}
sp951 2011-08-27
  • 打赏
  • 举报
回复
将文件转换流,文件多大都可以的
控制每次读的大小就可以了。
jglie 2011-08-27
  • 打赏
  • 举报
回复
多谢楼上各位的支持。2楼说的我看了,他那个是读取文本文件,逐行读取文件的。文中还提到了双缓存来提高读文件的性能。但还是不能解决我的问题。我的问题是,在读取1G以上的文件时,内存和数据如何申请和保存呢? 内存会占用很大 ,最后会导致溢出
萧炎 2011-08-27
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
或许和开发机内存太小有关系吧?加块内存试试看还会报错吗?
随枫而来 2011-08-27
  • 打赏
  • 举报
回复
学习,帮顶!
gzdiablo 2011-08-27
  • 打赏
  • 举报
回复
看应用吧,实在不够的话用内存映射文件
bios8086 2011-08-27
  • 打赏
  • 举报
回复
我来关注这个问题

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧