在python中高效写入Compact Flash

时间:2011-07-06 13:16:55

标签: python python-2.4

我正在写一个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)(请不要伤害我)

2 个答案:

答案 0 :(得分:1)

速度取决于缓冲区大小与紧凑型闪存的特定特性无关,但对于(相对)慢速设备的所有I / O都是固有的,即使对于各种系统调用也是如此。您应该尽可能地使缓冲区大小不会耗尽内存 - 对于闪存驱动器,2MiB应该足够了。

您应该使用timestrace实用程序来确定程序速度较慢的原因。如果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())