python - 在 python 中高效写入 Compact Flash

标签 python python-2.4

我正在编写一个图形用户界面来执行美化的“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 对于闪存驱动器应该足够了。

您应该使用 timestrace 实用程序来确定您的程序变慢的原因。如果 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/

相关文章:

python - 我可以用什么代替 python 2.4 中的 next()

Python 2.4 subprocess.CalledProcessError 替代品

python - 0.5秒后如何在python 2.4中发出警报信号

python - 循环内循环 python

python - Tensorflow:更改深度 CNN 的批量大小时出错

Python Bokeh 可能存在错误,仅显示最后一张图

python - 使用 Pandas 查找具有 Null 的 2 列之间的差异

在 Windows 中使用多处理进行 Python 日志记录

python - 在 python 中将 Tuple 传递给 MySQLdb 时出现问题

python - python 2.4 的 functools.wraps