C# 分析大型文本文件,动态修改
我需要实时解析一个大的CSV文件,而它正被另一个进程修改。总的来说,我的意思是在这一点上大约20GB,并且缓慢增长。应用程序只需要检测和报告数据流中的某些异常,对于这些异常,它只需要存储小的状态信息(C# 分析大型文本文件,动态修改,c#,csv,stream,real-time,large-files,C#,Csv,Stream,Real Time,Large Files,我需要实时解析一个大的CSV文件,而它正被另一个进程修改。总的来说,我的意思是在这一点上大约20GB,并且缓慢增长。应用程序只需要检测和报告数据流中的某些异常,对于这些异常,它只需要存储小的状态信息(O(1)space) 我在考虑每隔几秒钟轮询一次文件的属性(大小),打开一个只读流,查找到前面的位置,然后继续解析我第一次停止的位置。但由于这是一个文本(CSV)文件,我显然需要在继续时跟踪新行字符,以确保始终解析整行 如果我没有弄错的话,这不应该是一个要实现的问题,但是我想知道是否有一个通用的方法
O(1)
space)
我在考虑每隔几秒钟轮询一次文件的属性(大小),打开一个只读流,查找到前面的位置,然后继续解析我第一次停止的位置。但由于这是一个文本(CSV)文件,我显然需要在继续时跟踪新行字符,以确保始终解析整行
如果我没有弄错的话,这不应该是一个要实现的问题,但是我想知道是否有一个通用的方法/库已经解决了其中的一些问题
注意:我不需要CSV解析器。我需要有关一个库的信息,该库可以简化从正在动态修改的文件中读取行的过程。这里有一个小问题:
- 读取和解析CSV需要文本阅读器
- 定位对文本阅读器不起作用李>
它应该是7位ASCII,只有一些GUID和数字
这使得跟踪文件位置(pos+=line.Length+2)成为可能。一定要用
Encoding.ASCII
打开它。然后,您可以将其作为普通二进制流重新打开,搜索到最后一个位置,然后将StreamReader附加到该流 为什么不在每次开始解析时剥离一个单独的进程/线程呢?这样,您就可以将并发(动态)部分从数据源移到数据接收器,所以现在您只需要了解如何从所有线程收集结果
这将意味着为每个线程重新读取整个文件,不过
您可以在这两个版本上运行一个diff程序,然后从中提取,这取决于csv数据源的格式有多好:它是否修改已经写入的记录?还是只是附加新记录?如果是这样,您可以将新内容(当前eof的最后位置)拆分为一个新文件,并在后台线程中轻松处理这些内容:
- 轮询线程记住最后一个文件大小
- 当文件变大时:从最后一个位置搜索到最后一个位置,保存到临时文件
- 后台线程按照创建/修改的顺序处理所有剩余的临时文件