【问题标题】:Performance of write() in Python 2.7?Python 2.7 中 write() 的性能?
【发布时间】: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_fileidx_file时指定一个大的写缓冲区?
  • (1) 公平地说,我不是。硬盘都是通过 S.M.A.R.T 的 7200RPM SATA2 硬盘,而笔记本电脑的驱动器实际上要旧得多。 (2) 我试过 20MB、50MB 和 100MB 的缓冲区。它似乎对速度几乎没有影响。直到明天我才有机会在另一台 Windows 机器上对此进行测试,但是当我这样做时,我会报告我是否看到相同的行为。
  • 其他一些(纯属推测的)想法:(a) Windows 机器上的内存使用情况如何?您正在构建一些大字符串;也许你开始交换了。不积累dat_textidx_text的数据会不会更快?
  • (b) 您正在交替访问三个不同的文件。在 Windows 机器上,磁盘上文件的布局可能是不幸的,并且该访问模式的旋转延迟正在伤害您。如果你有足够的内存,尝试一次读入old_file,然后进行一次迭代,写入dat_file,再进行一次迭代,写入idx_file。这会改变整体时间吗?
  • (顺便说一句,虽然我不熟悉 Windows 如何执行 IO 缓冲,但我猜 20MB 太大了,你所做的只是给内核带来更多的工作。我正在考虑更多类似 4k 或 16k 的东西。)

标签: performance file-io python-2.7 windows-7


【解决方案1】:

(转发评论作为答案。)

Windows 机器上的内存使用情况如何?您正在内存中建立一些大字符串;也许这会导致交换。不积累dat_textidx_text的数据会不会更快?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2016-06-25
    • 2018-05-07
    • 2016-10-17
    • 2011-05-20
    • 2018-07-10
    相关资源
    最近更新 更多