我需要实时解析一个大的CSV文件,同时它被不同的进程修改(附加(。总的来说,我的意思是此时~20 GB,并且正在缓慢增长。应用程序只需要检测和报告数据流中的某些异常,为此它只需要存储小状态信息(O(1)
空间(。
正在考虑每隔几秒钟轮询一次文件的属性(大小(,打开一个只读流,寻找上一个位置,然后继续解析我第一次停止的位置。但由于这是一个文本 (CSV( 文件,因此在以某种方式继续时,我显然需要跟踪换行符,以确保我始终解析整行。
如果我没记错的话,这应该不是一个实现的问题,但我想知道是否有一种通用的方法/库已经解决了其中一些问题?
注意:我不需要 CSV 解析器。我需要有关库的信息,该库可以简化从正在动态修改的文件中读取行的过程。
测试它,但我认为您可以使用文件系统观察器来检测不同进程何时修改了您的文件。在更改事件中,您将能够寻找之前保存的位置,并阅读其他内容。
一个小问题:
- 读取和解析 CSV 需要文本阅读器
- 定位不适用于文本阅读器。
第一个想法:保持打开状态。如果生产者和分析器都以非独占模式运行,则应该可以读取行直到空,暂停,ReadLine直到空等。
它应该是 7 位 ASCII,只是一些 Guid 和数字
这使得跟踪文件位置(pos += 行。长度+2(。请确保使用Encoding.ASCII
打开它。然后,您可以将其重新打开为纯二进制流,查找到最后一个位置,然后才将流读取器附加到该流。
为什么每次开始解析时都不剥离一个单独的进程/线程 - 这样,您将并发(动态(部分从数据源移动到数据接收器 - 所以现在你只需要弄清楚如何从所有线程收集结果......
不过,这将意味着为您启动的每个线程重新读取整个文件......
您可以在两个版本上运行差异程序并从那里开始,具体取决于 csv 数据源的格式如何:它是否修改已写入的记录?还是只是附加新记录?如果是这样,您可以将新内容(最后位置到当前 eof(拆分为一个新文件,并在后台线程中随意处理它们:
- 轮询线程记住最后一个文件大小
- 当文件变大时:从最后一个位置到结尾查找,保存到临时文件
- 后台线程按创建/修改顺序处理剩余的任何临时文件