Performance Python 2.7中write()的性能?
我发现write()在使用Python 2.7.3的Windows 7上的性能特别慢。这与使用Archlinux在我的笔记本电脑上运行的相同代码相比,Archlinux的执行速度至少要快10-30倍。我是否做错了什么,是否有一些参数我可以调整以尝试和帮助事情?我应该使用writelins()而不是write() 具体情况如下: 对于文件的每一行,将一行写入其他两个文件。我基本上是在重新格式化文件 所讨论的文件大小约为350MB,大约包含200.000行。在我运行Archlinux的笔记本电脑上,这个过程大约在1-2分钟内完成。在Windows上,22分钟的内存只写了165MB。如果这是一次性的,这不会是一个问题,但由于我将把它交给其他人运行,我想弄清楚我是否能以某种方式改进它。其中有五个文件,这意味着需要几个小时的处理 相关代码:Performance Python 2.7中write()的性能?,performance,file-io,python-2.7,windows-7,Performance,File Io,Python 2.7,Windows 7,我发现write()在使用Python 2.7.3的Windows 7上的性能特别慢。这与使用Archlinux在我的笔记本电脑上运行的相同代码相比,Archlinux的执行速度至少要快10-30倍。我是否做错了什么,是否有一些参数我可以调整以尝试和帮助事情?我应该使用writelins()而不是write() 具体情况如下: 对于文件的每一行,将一行写入其他两个文件。我基本上是在重新格式化文件 所讨论的文件大小约为350MB,大约包含200.000行。在我运行Archlinux的笔记本电脑上,
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
(重新发布评论作为回答。)
Windows计算机上的内存使用情况如何?您正在内存中建立一些大字符串;也许这导致了交换。如果不在
dat_text
和idx_text
中积累数据,速度会更快吗 (1)您对操作系统是相关因素的信心有多大?这两台机器的硬盘驱动器可比吗?(2) 您是否尝试过在打开dat_文件
和idx_文件
时指定一个大的写入缓冲区?(1)公平地说,我没有。硬盘驱动器都是通过S.M.A.R.T.的7200RPM SATA2硬盘驱动器,而笔记本电脑驱动器实际上要旧得多。(2) 我尝试了20MB、50MB和100MB的缓冲区。这似乎对速度几乎没有影响。直到明天,我才有机会在另一台Windows机器上测试这一点,但当我测试时,我会报告我是否看到相同的行为。其他一些(纯粹是推测性的)想法:(a)Windows机器上的内存使用情况如何?你正在建立一些大的字符串;也许你开始交换了。如果您不在dat_text
和idx_text
中积累数据,是否会更快?(b)您正在交替访问三个不同的文件。在Windows计算机上,磁盘上文件的布局可能是不幸的,这种访问模式的旋转延迟正在伤害您。如果您有足够的内存,请尝试一次全部读取旧的\u文件
,然后执行一次迭代,在其中写入dat\u文件
,在另一次迭代中写入idx\u文件
。这会改变总体时间吗?(顺便说一句,虽然我不熟悉Windows如何执行IO缓冲,但我猜20MB太大了,而您所做的只是为内核做更多的工作。我正在考虑一些类似4k或16k的东西。)