【发布时间】:2016-06-28 11:18:03
【问题描述】:
每个人。 我想解析 300+Mb 文本文件,其中包含 2.000.000+ 行,并使用存储的数据进行一些操作(分割每一行,进行比较,将数据保存在字典中。)。 程序大约需要 50+ 分钟才能获得预期的结果(对于 80.000 行的文件,大约需要 15-20 秒) 有没有办法让它更快地工作? 下面的代码示例:
using (FileStream cut_file = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(cut_file))
using (StreamReader s_reader = new StreamReader(bs)) {
string line;
while ((line = s_reader.ReadLine()) != null) {
string[] every_item = line.Split('|'); //line sample: jdsga237 | 3332, 3223, 121 |
string car = every_item[0];
string[] cameras = every_item[1].Split(',');
if (!cars.Contains(car)) { //cars is List<string> defined at the beginning of programm
for (int camera = 0; camera < cameras.Count(); camera++) {
if (cams_input.Contains(cameras[camera])) { //cams_input is List<string> defined at the beginning of programm
cars.Add(car);
result[myfile]++; //result is Dictionary<string, int>. Used dict. for parsing several files.
}
}
}
}
}
【问题讨论】:
-
我认为您有内存问题。在程序运行时打开任务管理器并观察内存使用情况。如果您的计算机上没有足够的内存,则数据将被放入硬盘驱动器上的交换空间,这将显着降低应用程序的速度。尝试在内存更大的计算机上运行。
-
两种解决方案:您可以尝试异步编写,否则不要逐行读取,尝试通过正则表达式解决。
-
您还应该考虑一次性解析,因为 String.Split 在基本相同的字符串上多次使用时效率非常低。此外,您可以将
HashSet<String>用于cams_input和cars。
标签: c# parsing text-files