目的是每读一行,分割数据处理显示,现在实现的是先预读所有行,然后存下来,最后用定时器将存的一行处理显示。
但是这样做太占内存,而且文件太大的时候肯定会卡。所以现在想先读100行存完处理,再读取之后的,以此一直下去,如果下面不足100行,则一次性读完存储处理。不知道各位有什么好的方法没,谢谢!!C#文件读取
但是这样做太占内存,而且文件太大的时候肯定会卡。所以现在想先读100行存完处理,再读取之后的,以此一直下去,如果下面不足100行,则一次性读完存储处理。不知道各位有什么好的方法没,谢谢!!C#文件读取
string path= Server.MapPath(filePath);
System.IO.StreamReader file = new System.IO.StreamReader(path, Encoding.Default);
string line;
while ((line = file.ReadLine()) != null)
{
//是否读第一行
if (isReadOne.Value) continue; DataRow dr = dtSuccess.NewRow();
//读txt数据
string[] fields = null;
if (fileType == "csv") fields = line.Split(new char[] { ',' });
else if (fileType == "txt") fields = line.Split(new char[] { '\t' }); if (fields.Count() != dtDatas.Count()) continue; for (int i = 0; i < fields.Length; i++)
{
string sColunId = dtDatas[i].ToString();
dr[sColunId] = fields[i];
}
dtSuccess.Rows.Add(dr);
可以使用流水线的概念啊。
并不需要很多的线程,3个足以:读文件线程,处理数据线程,显示数据线程
建立两个缓存队列,一个存储读文件读出来的数据,一个存储处理完毕需要显示的数据这样的话,可以解决你想的海量数据全部放内存的问题,又可以不需要定量100个具体做法这样来:
读文件的线程只是读文件,读完了文件,放到队列A
队列A自己继承集合类写一个,主要是为了增加一个回调的event,当有新的数据进来的时候,就触发一个event。
队列A的event里面调用处理数据线程的信号灯,让处理数据线程去队列A取数据,处理。
处理完毕,把结果丢给队列B,队列B同样有个event被触发。
队列B的event调用显示数据线程的信号灯,显示线程显示数据。写的有点麻烦,但是静下心来看看,你会看明白的
这个读取几十G都没问题。
读行要自己去处理,反回继续上次的位置,要自己保存上次读到什么位置。反正没有那么简单就搞定的。自己写个FileReader类来处理吧。
感觉
多线程,offset,比较靠谱
我在给个意见吧 序列化再反序列化
是的,既然是海量数据,那么就不要想着一次读完,offset也可以,只不过offset需要长时间占用那个文件,我个人不推荐。