C# 读取超大文本文件(2G左右),求解决办法!

zhangshuqiang123 2010-12-17 01:18:13
想在要用程序读取一个超大的文本文件,文件大小在2G左右,甚至还多。文件格式是连续的一串表示十六进制的文本如(FF092B3A....),我要把它们读出来放到内存中,然后按照一定的公式来运行,按照普通的读取方式。肯定不行了。有经验的来指导指导我这个菜鸟吧。神马分块读取,神马内存映射,看的都不懂啊。。
...全文
5460 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangshuqiang123 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 flyerwing 的回复:]

分段读取一次读N分之一来处理.
[/Quote]我觉得10楼的分块处理可以的,但是读出来的东西不知道是什么东西。文件里面都是些表示十六进制的字符,要两个两个字符分割开来。放在数组中,比如说“FF”要读到一起处理成255.。。
  • 打赏
  • 举报
回复
+log4 net
[Quote=引用 3 楼 wuyq11 的回复:]
使用silverlight或者flash
断点续传
[/Quote]
flyerwing 2010-12-20
  • 打赏
  • 举报
回复
分段读取一次读N分之一来处理.
zhangshuqiang123 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 zanfeng 的回复:]

内存映射也就那几个API。c#也可以一样用。

txt文档没有必要用内存映射。
stream够用。
[/Quote]

哦,这样的啊,那我就从简单的方法开始了
潇洒王子 2010-12-20
  • 打赏
  • 举报
回复
想把三角变五星得天天回答问题才能行
whrspsoft3723 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 jixiangcn 的回复:]
.NET 4.0才支持内存映射文件
[/Quote]
这是哪里的文档告诉你的?
whrspsoft3723 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sp1234 的回复:]
呵呵,知道何时不可教,才是会教。
acer3680 2010-12-18
  • 打赏
  • 举报
回复
出售 oa系统源码,系统使用asp.net+sql2005 开发,并承接c#程序编写,有意请联系QQ:114805001
飞天毛头 2010-12-18
  • 打赏
  • 举报
回复
.NET 4.0才支持内存映射文件
mayuliuze 2010-12-18
  • 打赏
  • 举报
回复
我也要读入文本文档的数据!涉及到怎样识别不同位置不同索引号,学习啦
  • 打赏
  • 举报
回复
up~~
龍过鸡年 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sp1234 的回复:]

引用楼主 zhangshuqiang123 的回复:
神马分块读取,神马内存映射,看的都不懂啊。。


那就找一个懂的来工作,你给打个下手递个烟递个鼠标地就行了。
[/Quote]

这回答的太给力了,估计楼主要崩溃了,哈哈!
足球中国 2010-12-18
  • 打赏
  • 举报
回复
内存映射也就那几个API。c#也可以一样用。

txt文档没有必要用内存映射。
stream够用。
绿色夹克衫 2010-12-17
  • 打赏
  • 举报
回复
用流的话,一个一个字符Read()不就可以了?2G不算大,知道拆分规则就好。
hinada99 2010-12-17
  • 打赏
  • 举报
回复
每天坚持祝福
mail_ricklee 2010-12-17
  • 打赏
  • 举报
回复

using (var reader = new StreamReader(responseStream, encoding))
{
//10k
var clen = 1024 * 10;
var read = new Char[clen];
var count = reader.Read(read, 0, clen);
while (count > 0)
{
var str = new string(read, 0, count);
rsb.Append(str);
count = reader.Read(read, 0, clen);
}
reader.Close();
reader.Dispose();
responseStream.Dispose();
responseStream.Close();
response.Close();
}
杨友山 2010-12-17
  • 打赏
  • 举报
回复
很复杂
emine1003Z 2010-12-17
  • 打赏
  • 举报
回复
这是我用C++ 写的COM组件 对文件分批加密
能对你有点启发,或者你也可以写一COM 组件处理你的大批量文件转换.
希望对你有点帮助


	dwBlockLen=1000-1000 % ENCRYPT_BLOCK_SIZE;//文件处理的字节数,字节数你自行设置,关于带有后面的参数的代码你直接可以忽略

if(ENCRYPT_BLOCK_SIZE>1)
{
dwBufferLen=dwBlockLen+ENCRYPT_BLOCK_SIZE;
}
else
{
dwBufferLen=dwBlockLen;
}
if(pbBuffer=(BYTE *)malloc(dwBufferLen))//申请的系统内存长度,是你每次要处理的字节长度
{
;
}
else
{
HandleError("内存不够了.\n");
}
//----------------------------------------------------------------------------
//不断的循环加密原文件,把密文写入密文文件

do
{
//读取原文dwBlockLen 字节
dwCount=fread(pbBuffer,1,dwBlockLen,hSource);
if(ferror(hSource))
{
HandleError("读取原文错误. \n");
}
//----------------------------------------------------------------------
//相当于你转换文件的格式的什么的,我这一快就是对文件进行加密
if(!CryptEncrypt( //成功返回TRUE
hKey,
0,
feof(hSource), //feof检测流上的文件结束符,指出是否是最后一次加密操作
0,
pbBuffer, //作为输入参数为加密数据的缓冲区指针,其长度由dwBufLen指定,作为输出参数为加密后的数据缓冲区
//指针,其长度由dwCount指定,此函数会把pbBUffer数据加密后的结果覆盖到pbBuffer缓冲区中.
&dwCount, //加密后的数据长度
dwBufferLen)) //被加密的数据长度
{
HandleError("调用CryptEncrypt 出错。 \n");
}

//把密文写入的密文文件
fwrite(pbBuffer,1,dwCount,hDestination);
if(ferror(hDestination))
{
HandleError("写入文件失败");
}
}
while(!feof(hSource)); //feof检测流上的文件结束符
v风雪山神庙v 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sp1234 的回复:]
引用楼主 zhangshuqiang123 的回复:
神马分块读取,神马内存映射,看的都不懂啊。。


那就找一个懂的来工作,你给打个下手递个烟递个鼠标地就行了。
[/Quote]
在路上20130607 2010-12-17
  • 打赏
  • 举报
回复
2G的 txt 你怎么看啊 ······
加载更多回复(30)

110,535

社区成员

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

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

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