Skip to main content
 首页 » 编程设计

python之在 python 中高效写入 Compact Flash

2025年05月04日9qq号

我正在编写一个图形用户界面来执行美化的“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 似乎只花费了一半的时间。也许在这里要加类,但我想闪存有一个最佳的字节数可以一次写入?谁能建议我如何发现这一点?

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

除了反复试验之外,任何人都可以建议一种优化上述代码的方法并推理其工作原理吗?例如,特别是 input.read() 的值是多少?

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

请您参考如下方法:

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

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

另请注意,之后您必须调用fsync(或执行sync 程序)以测量将文件写入到的实时时间磁盘(或使用 O_DIRECT 打开输出文件)。否则,操作系统会让您的程序退出,并将所有写入的数据保存在缓冲区中,然后不断将这些数据写入实际磁盘。要测试您是否做对了,请在程序完成后立即取出磁盘。请注意,速度差异可能是惊人的。如果您的磁盘(CF 卡)比可用的物理内存大很多,这种影响就不太明显。