【发布时间】:2014-05-20 01:45:59
【问题描述】:
我有几个想要阅读的日志文件。不失一般性,假设日志文件处理如下:
def process(infilepath):
answer = 0
with open (infilepath) as infile:
for line in infile:
if line.startswith(someStr):
answer += 1
return answer
因为我有很多日志文件,所以我想在这个问题上抛出多处理(我的第一个错误:我可能应该使用多线程;有人请告诉我为什么)
这样做时,我想到任何形式的并行处理在这里都应该是无用的,因为我的 HDD 上只有一个读取头这一事实限制了我,因此,可能只有一个文件一次阅读。事实上,在这种推理下,由于可能同时请求来自不同文件的行,读取头可能需要不时地显着移动,导致多进程方法比串行方法慢。所以我决定回到单个进程来读取我的日志文件。
但有趣的是,我注意到小文件 (= 445MB) 才会出现预期的减速。
这让我相信 python 可能会以块的形式读取文件,其大小超过我一次请求的一行。
Q1:那么文件读取机制到底是什么?
Q2:优化从传统硬盘读取文件的最佳方法是什么?
技术规格:
- python3.3
- 5400rpm 传统硬盘
- Mac OSX 10.9.2(小牛队)
【问题讨论】:
-
s/python/操作系统/
-
您的操作系统可能在块级别实现了至少 64K 字节的预读策略。
-
并且在引擎盖下有缓冲的 IO。注意:引擎盖下的内容不是特定于 python 的。一个好的起点是检查 C 和操作系统中发生的情况。
-
您所描述的是与虚拟分页系统有关的问题,以及如何在缓冲 IO 中为操作系统从文件中读取数据。欲了解更多信息,en.wikipedia.org/wiki/Virtual_memory。
-
从您列出的 python 代码中,“for line infile”可能会产生大量开销,具体取决于它们如何实现迭代器。您是否尝试过实施不同的方法来读取文件? (我讨厌 5 分钟编辑规则……不小心按了 Enter)
标签: python macos python-3.3 disk-io