我正在写一个gui来表演一个荣耀的'dd'。
我可以直接处理'dd',但我想我也可以使用python的open()
/ read()
/ write()
,如果可以的话,它会让我更多地显示进度容易。
this link提示我在这里:
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年似乎只花了一半的时间。也许这里为了OT,但我想闪存有一个最佳的字节数一次写入?谁能建议我如何发现这个?
图像&卡是1Gb所以我非常想回到~5分钟,如果可能的话。我很感激,我很可能无法与之匹敌。
有人能够建议一种方法来优化上述代码并推断其工作原理,而不是反复试验吗?特别是input.read()的值是多少?
一个限制:Linux上的python 2.4.3(centos5)(请不要伤害我)
答案 0 :(得分:1)
速度取决于缓冲区大小与紧凑型闪存的特定特性无关,但对于(相对)慢速设备的所有I / O都是固有的,即使对于各种系统调用也是如此。您应该尽可能地使缓冲区大小不会耗尽内存 - 对于闪存驱动器,2MiB应该足够了。
您应该使用time
和strace
实用程序来确定程序速度较慢的原因。如果time
显示大user/real
(大意义大于0.1
),则可以优化Python解释器 - cpython 2.4非常慢,并且您始终在创建新对象写入预分配的缓冲区。如果sys
时间存在显着差异,请分析两个程序(使用strace
)进行的系统调用,并尝试发出dd
时发出的系统调用。
另请注意,之后必须调用fsync
(或执行sync
程序)以测量将文件写入磁盘所花费的实际时间(或打开输出文件O_DIRECT
)。否则,操作系统将退出程序并将所有写入的数据保留在缓冲区中,然后将这些数据连续写入实际磁盘。要测试您是否正确执行,请在程序完成后立即删除磁盘。请注意,速度差异可能是惊人的。如果您的磁盘(CF卡)大于可用物理内存,则此效果不太明显。
答案 1 :(得分: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())