我需要实时解析一个大型CSV文件,而其他进程正在修改(附加)。从大到大,我的意思是此时约为20 GB,并且正在缓慢增长。应用程序只需要检测并报告数据流中的某些异常,只需要存储小的状态信息(O(1)
空间)。
我在考虑每隔几秒轮询一次文件的属性(大小),打开一个只读流,寻找前一个位置,然后继续解析我第一次停止的位置。但由于这是一个文本(CSV)文件,我显然需要在以某种方式继续跟踪换行符,以确保我总是解析整行。
如果我没有记错,这应该不是一个实现的问题,但我想知道是否有一个共同的方法/库来解决其中的一些问题?
注意:我不需要CSV解析器。我需要有关库的信息,这样可以简化从正在修改的文件中读取行的行。
答案 0 :(得分:2)
我没有对它进行测试,但我认为您可以使用FileSystemWatcher来检测其他进程何时修改了您的文件。在Changed事件中,您将能够找到之前保存的位置,并阅读其他内容。
答案 1 :(得分:1)
这里有一个小问题:
首先想到的是:保持开放。如果生产者和分析器都以非独占模式运行,则可能是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)拆分成一个新文件,然后在后台线程中处理这些东西: