6

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

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

如果我没记错的话,这不应该是一个实现的问题,但我想知道是否有一种通用的方法/库已经解决了其中一些问题?

注意:我不需要 CSV 解析器。我需要有关一个库的信息,该库可以简化从动态修改的文件中读取行的过程。

4

3 回答 3

2

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

于 2012-04-27T12:52:53.320 回答
1

这里有一个小问题:

  • 读取和解析 CSV 需要 TextReader
  • 定位不适用于 TextReaders。

第一个想法:保持开放。如果生产者和分析器都以非独占模式运行,则应该可以 ReadLine-until-null、pause、ReadLine-until-null 等。


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

这使得跟踪文件位置 (pos += line.Length+2) 成为可能。请确保使用Encoding.ASCII. 然后,您可以将其作为普通二进制流重新打开,查找到最后一个位置,然后才将 StreamReader 附加到该流。

于 2012-04-27T11:53:21.283 回答
0

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

意味着为您启动的每个线程重新读取整个文件,但是......

您可以在两个版本上运行差异程序并从那里获取,具体取决于 csv 数据源的格式:它是否修改已写入的记录?还是只是追加新记录?如果是这样,您可以将新内容(last-position 到 current-eof)拆分到一个新文件中,然后在后台线程中处理闲暇时的内容:

  • 轮询线程记住最后的文件大小
  • 当文件变大时:从最后一个位置搜索到最后,保存到临时文件
  • 后台线程按照创建/修改的顺序处理仍然存在的任何临时文件
于 2012-04-27T12:01:20.077 回答