|
|
1
8
这是我的优雅版C:
或更一般:
当然,您可能希望在给定行前后显示一些上下文:
或者更流利地说:
顺便说一句,
换句话说,它试图将整个100GB文件放入6GB的RAM中!手册应该说的是“这个函数永远不会抛出异常” 如果它不能访问文件 ." |
|
|
2
6
嗯,记忆 可以 在任何时候,异步和不可预测地运行——这就是为什么“从不例外”的承诺并不真正适用于此(就像在Java中那样,每个方法都必须指定哪些例外情况可以提出,一些例外被豁免这个规则,因为几乎任何方法,不可预测的,都可以在任何时候由于资源而提高它们。稀缺性或其他全系统问题)。
在这里,
稍微快一点
许多
更复杂的是,例如,一次读取100 MB(二进制模式)到缓冲区;计算缓冲区中的行尾数(仅为
编辑
:由于OP注释怀疑通过缓冲区而不是通过行来读取可能会造成性能差异,因此我解开了一段旧代码,在其中我测量了两种方法以执行某种相关任务——使用缓冲区方法计算行数、在行上执行循环,或者一次性读取内存中的整个文件(通过
平台是MacOS Pro笔记本电脑、OSX 10.5.8、Intel Core 2 Duo 2.4 GHz、python 2.6.5。
测试模块,
这个
当然,在进行了几次试运行之后,为了确保每个人都能从操作系统、磁盘控制器和文件系统的预读功能(如果有的话)中获得同等的好处,需要进行测量:
这些数字是可重复的。如你所见,即使在这么小的文件上(小于5 MB!),按行方法比基于缓冲区的方法慢——只是浪费了太多的精力! 为了检查可伸缩性,我接下来使用了4倍大的文件,如下所示:
而且,正如所预测的,按缓冲区方法的比例几乎是线性的。外推法(当然总是一种冒险的尝试;-)每秒低于200 MB似乎是可预测的性能——称之为每GB 6秒,或100 GB 10分钟。 当然,这个小程序所做的只是行计数,但是(一旦有足够的I/O来摊销常量开销;-)读取特定行的程序应该具有类似的性能(即使一旦找到了“兴趣缓冲区”,它就需要更多的处理),这大概是 常数 对给定大小的缓冲区的处理量——大概是重复地将缓冲区减半,以识别其中足够小的部分,然后再对减半后的“缓冲区余数”的大小进行一点线性处理。 优雅的?不是真的…但是,对于速度来说,很难打败!-) |
|
|
3
1
你可以试试这个SED一行程序:
|
|
|
4
0
不是一个优雅但速度更快的解决方案是使用多个线程(或.NET 4.0中的任务)同时读取和处理多个文件块。 |
|
|
5
0
如果您希望在同一个文件上经常需要这个操作,那么创建一个索引是有意义的。 通过浏览整个文件一次并记录行开始的位置(例如在sqlite数据库中),可以创建索引。然后,当您需要转到一个特定的行时,您查询该行的索引,找到该位置并读取该行。 |
|
|
7BeholdeR7 · 文件夹的重量超过其中的文件(六倍) 3 年前 |
|
|
ilteris · 为什么程序在fscanf后崩溃 3 年前 |
|
Peaceful · 使用fscanf读取C中具有未知行数的文件 3 年前 |
|
|
NOCi · 如何将Tensorflow的结果记录到CSV文件 3 年前 |
|
|
Oakzeh · 如何在字符串索引之前读取文件并删除字符 3 年前 |