解析大文本文件,即时修改

时间:2012-04-27 11:41:10

标签: c# csv stream real-time large-files

我需要实时解析一个大型CSV文件,而其他进程正在修改(附加)。从大到大,我的意思是此时约为20 GB,并且正在缓慢增长。应用程序只需要检测并报告数据流中的某些异常,只需要存储小的状态信息(O(1)空间)。

我在考虑每隔几秒轮询一次文件的属性(大小),打开一个只读流,寻找前一个位置,然后继续解析我第一次停止的位置。但由于这是一个文本(CSV)文件,我显然需要在以某种方式继续跟踪换行符,以确保我总是解析整行。

如果我没有记错,这应该不是一个实现的问题,但我想知道是否有一个共同的方法/库来解决其中的一些问题?

注意:我不需要CSV解析器。我需要有关库的信息,这样可以简化从正在修改的文件中读取行的行。

3 个答案:

答案 0 :(得分:2)

我没有对它进行测试,但我认为您可以使用FileSystemWatcher来检测其他进程何时修改了您的文件。在Changed事件中,您将能够找到之前保存的位置,并阅读其他内容。

答案 1 :(得分:1)

这里有一个小问题:

  • 阅读和解析CSV需要TextReader
  • 使用TextReaders定位不起作用。

首先想到的是:保持开放。如果生产者和分析器都以非独占模式运行,则可能是ReadLine-until-null,pause,ReadLine-until-null等。


  

它应该是7位ASCII,只是一些Guids和数字

这样就可以跟踪文件位置(pos + = line.Length + 2)。确保使用Encoding.ASCII打开它。然后,您可以将其重新打开为纯二进制流,搜索到最后一个位置,然后将StreamReader附加到该流。

答案 2 :(得分:0)

为什么不在每次开始解析时分离出一个单独的进程/线程 - 这样,你将并发(即时)部分从数据源移到数据接收器 - 所以现在你只需要弄清楚如何从你所有的线程中收集结果......

这个意味着重新读取你旋转的每个线程的整个文件,但是......

您可以在这两个版本上运行diff程序并从那里获取,具体取决于csv数据源的格式良好:它是否修改已写入的记录?或者只是附加新记录?如果是这样,你可以将新东西(last-position到current-eof)拆分成一个新文件,然后在后台线程中处理这些东西:

  • 轮询线程会记住上一个文件大小
  • 当文件变大时:从上一个位置搜索到结束,保存到临时文件
  • 后台线程按照创建/修改的顺序处理仍然剩下的所有临时文件