我正在编写一个图形用户界面来执行美化的“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 卡)比可用的物理内存大很多,这种影响就不太明显。
关于python - 在 python 中高效写入 Compact Flash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6597020/