Dav*_*ide 12 python linux performance text-files
考虑这个python程序:
import sys
lc = 0
for line in open(sys.argv[1]):
lc = lc + 1
print lc, sys.argv[1]
Run Code Online (Sandbox Code Playgroud)
在我的6GB文本文件上运行它,它在~2分钟内完成.
问题:是否有可能加快速度?
请注意,同一时间需要:
wc -l myfile.txt
Run Code Online (Sandbox Code Playgroud)
所以,我怀疑对我的问题的回答只是一个简单的"不".
另请注意,我的真实程序正在做一些比计算线条更有趣的事情,所以请给出一个通用答案,而不是行计数技巧(比如在文件中保留行数元数据)
PS:我在这个问题上标记了"linux",因为我只对linux特定的答案感兴趣.如果有的话,请随意提供与操作系统无关的内容,甚至是其他操作系统的答案.
另见后续问题
tgr*_*ray 12
抛出硬件问题.
正如gs所指出的,你的瓶颈是硬盘传输速率.所以,不,你不能使用更好的算法来改善你的时间,但你可以购买更快的硬盘.
编辑: gs的另一个好点; 您还可以使用RAID配置来提高速度.这可以通过硬件或软件(例如OS X,Linux,Windows Server等)完成.
控制方程
(Amount to transfer) / (transfer rate) = (time to transfer)
(6000 MB) / (60 MB/s) = 100 seconds
(6000 MB) / (125 MB/s) = 48 seconds
硬件方案
据称ioDrive Duo是企业环境中最快的解决方案,"将于2009年4月上市".
或者您可以查看WD Velociraptor硬盘(10,000 rpm).
此外,我听说Seagate Cheetah是一个不错的选择(15,000 rpm,持续125 MB/s的传输速率).
诀窍不是让电子移动得更快(这很难),而是每单位时间完成更多的工作.
首先,确保您的6GB文件读取是I/O绑定,而不是CPU绑定.
如果它受I/O限制,请考虑"扇出"设计模式.
父进程产生了一堆孩子.
父级读取6Gb文件,并通过写入其STDIN管道将子行交给子级.6GB的读取时间将保持不变.行处理应尽可能少地处理父处理.应该使用非常简单的过滤器或计数.
管道是用于通信的内存中通道.它是一个带有阅读器和写入器的共享缓冲区.
每个孩子从STDIN中读取一行,并做适当的工作.每个孩子应该写一个简单的磁盘文件,其中包含最终(汇总,减少)结果.稍后,可以合并这些文件中的结果.
您无法获得比最大磁盘读取速度更快的速度。
为了达到最大磁盘速度,您可以使用以下两个技巧:
| 归档时间: |
|
| 查看次数: |
13869 次 |
| 最近记录: |