2

我正在编写一个 gui 来执行美化的“dd”。

我可以只对“dd”进行子处理,但我想如果可以的话,我还不如使用python的open()// read()write()因为它可以让我更轻松地显示进度。

在此链接的提示下,我有:

input = open('filename.img', 'rb')
output = open("/dev/sdc", 'wb')
while True:
    buffer = input.read(1024)
    if buffer:
        output.write(buffer)
    else:
        break
input.close()
output.close()

...但是速度非常慢。或者至少远慢于dd. (大约慢 4-5 倍)

我玩了一下,注意到改变“缓冲”的字节数对完成速度有很大的影响。例如,将其提高到 2048 似乎只需要一半的时间。也许在这里会过时,但我猜闪存有最佳的一次写入字节数?谁能建议我如何发现这一点?

图像和卡是 1Gb,所以如果可能的话,我非常想回到 dd 大约 5 分钟的时间。我很感激我很可能不会匹配它。

除了反复试验,任何人都可以提出一种优化上述代码的方法并推理它为什么起作用?尤其是 input.read() 例如什么值?

限制之一:python 2.4.3 on linux (centos5) (请不要伤害我)

4

2 回答 2

1

取决于缓冲区大小的速度与紧凑型闪存的特定特性无关,而是所有具有(相对)慢速设备的 I/O 所固有的,甚至与各种系统调用有关。您应该在不耗尽内存的情况下使缓冲区大小尽可能大 - 2MiB 对于闪存驱动器应该足够了。

您应该使用timestrace实用程序来确定程序变慢的原因。如果time显示大user/real(大意味着大于0.1),您可以优化您的 Python 解释器 - cpython 2.4 非常慢,并且您一直在创建新对象而不是写入预分配的缓冲区。如果时间上有显着差异sys,请分析两个程序(带有 )所做的系统调用,strace并尝试发出这些系统调用dd

另请注意,您必须在之后调用fsync(或执行sync程序)来测量将文件写入磁盘(或使用打开输出文件O_DIRECT)所花费的实时时间。否则,操作系统将让您的程序退出,并将所有写入的数据保存在缓冲区中,然后不断地写入实际磁盘。要测试您是否正确执行此操作,请在程序完成后立即移除磁盘。请注意,速度差异可能是惊人的。如果您的磁盘(CF 卡)远大于可用的物理内存,则此效果不太明显。

于 2011-07-06T15:15:22.347 回答
0

因此,在一些帮助下,我完全删除了“缓冲区”位并添加了一个os.fsync().

import os

input = open('filename.img', 'rb')
output = open("/dev/sdc", 'wb')
output.write(input.read())
input.close()
output.close()
outputfile.flush()
os.fsync(outputfile.fileno())
于 2011-07-06T15:07:03.090 回答