【发布时间】:2013-07-07 21:46:39
【问题描述】:
我发现使用 Python 2.7.3 在 Windows 7 上 write() 的性能异常缓慢。这与在我的笔记本电脑上使用 Archlinux 运行的相同代码进行比较,后者的运行速度至少快 10 到 30 倍。我做错了什么,有没有我可以调整的参数来尝试帮助事情?我应该使用 writelins() 而不是 write() 吗?
具体场景如下:
对于文件的每一行,将一行写入其他两个文件。我基本上是在重新格式化文件。
有问题的文件大小约为 350MB,包含大约 200.000 行。在我运行 Archlinux 的笔记本电脑上,这个过程大约在 1-2 分钟内完成。在 Windows 上,22 分钟只写了 165MB。如果这是一次性的事情,这不会是一个问题,但是当我将它交给其他人运行时,我想弄清楚我是否不能以某种方式改进它。其中有五个文件,这意味着需要几个小时的过程。
相关代码:
with open('%s/%s.dat' % (cacheDir, f_from), 'r') as old_file:
with open('%s/%s.dat' % (vectorsDir, f_to), 'w+') as dat_file:
with open('%s/%s.idx' % (vectorsDir, f_to), 'w+') as idx_file:
dat_text = ''
idx_text = ''
for line in old_file:
data = line.split()
cats = self.ids[data[0]]
dat_line = '%s %s\n' % (string.join(cats,','), string.join(data[1:]))
idx_line = '%s\n' % data[0]
dat_text += dat_line
idx_text += idx_line
dat_file.write(dat_line)
idx_file.write(idx_line)
return dat_text, idx_text
【问题讨论】:
-
(1) 您对操作系统是相关因素的信心如何?两台机器的硬盘有可比性吗? (2)你有没有试过在打开
dat_file和idx_file时指定一个大的写缓冲区? -
(1) 公平地说,我不是。硬盘都是通过 S.M.A.R.T 的 7200RPM SATA2 硬盘,而笔记本电脑的驱动器实际上要旧得多。 (2) 我试过 20MB、50MB 和 100MB 的缓冲区。它似乎对速度几乎没有影响。直到明天我才有机会在另一台 Windows 机器上对此进行测试,但是当我这样做时,我会报告我是否看到相同的行为。
-
其他一些(纯属推测的)想法:(a) Windows 机器上的内存使用情况如何?您正在构建一些大字符串;也许你开始交换了。不积累
dat_text和idx_text的数据会不会更快? -
(b) 您正在交替访问三个不同的文件。在 Windows 机器上,磁盘上文件的布局可能是不幸的,并且该访问模式的旋转延迟正在伤害您。如果你有足够的内存,尝试一次读入
old_file,然后进行一次迭代,写入dat_file,再进行一次迭代,写入idx_file。这会改变整体时间吗? -
(顺便说一句,虽然我不熟悉 Windows 如何执行 IO 缓冲,但我猜 20MB 太大了,你所做的只是给内核带来更多的工作。我正在考虑更多类似 4k 或 16k 的东西。)
标签: performance file-io python-2.7 windows-7