python - 使用 python 处理磁盘中的大量数据的最有效方法是什么?

标签 python optimization binary-data hard-drive raid

我正在编写一个简单的 python 脚本来读取和重建失败的 RAID5 阵列中的数据,而我无法以任何其他方式重建该阵列。我的脚本正在运行,但速度很慢。我的原始脚本的运行速度约为 80MB/分钟。此后我改进了脚本,它的运行速度为 550MB/分钟,但这似乎仍然有点低。 python 脚本占用 100% CPU,因此它似乎是受 CPU 而不是磁盘限制,这意味着我有优化的机会。因为脚本根本不是很长,所以我无法有效地分析它,所以我不知道是什么吞噬了它。这是我现在的脚本(或者至少是重要的部分)

disk0chunk = disk0.read(chunkSize)
#disk1 is missing, bad firmware
disk2chunk = disk2.read(chunkSize)
disk3chunk = disk3.read(chunkSize)
if (parityDisk % 4 == 1): #if the parity stripe is on the missing drive
  output.write(disk0chunk + disk2chunk + disk3chunk)
else: #we need to rebuild the data in disk1
  # disk0num = map(ord, disk0chunk) #inefficient, old code
  # disk2num = map(ord, disk2chunk) #inefficient, old code
  # disk3num = map(ord, disk3chunk) #inefficient, old code
  disk0num = struct.depack("16384l", disk0chunk) #more efficient new code
  disk2num = struct.depack("16384l", disk2chunk) #more efficient new code
  disk3num = struct.depack("16384l", disk3chunk) #more efficient new code
  magicpotato = zip(disk0num,disk2num,disk3num)
  disk1num = map(takexor, magicpotato)
  # disk1bytes = map(chr, disk1num) #inefficient, old code
  # disk1chunk = ''.join(disk1bytes) #inefficient, old code
  disk1chunk = struct.pack("16384l", *disk1num) #more efficient new code

  #output nonparity to based on parityDisk

def takexor(magicpotato):
  return magicpotato[0]^magicpotato[1]^magicpotato[2]

粗体表示这个巨大文本 block 中的实际问题:

我可以做些什么来让这个更快/更好吗?如果我什么也没想到,我能做些什么来更好地研究是什么让事情进展缓慢? (是否有一种方法可以在每行级别上分析 python?)我是否以正确的方式处理这个问题,或者是否有更好的方法来处理大量的二进制数据?

我问的原因是我有一个 3TB 驱动器重建,即使它工作正常(我可以很好地挂载图像、循环和浏览文件),它也需要很长时间。我用旧代码测量需要到一月中旬,现在需要到圣诞节(所以它更好,但仍然比我预期的要慢。)

在你问之前,这是一个 mdadm RAID5(64kb block 大小,左对称),但 mdadm 元数据不知何故丢失,并且 mdadm 不允许您在不将元数据重写到磁盘的情况下重新配置 RAID5,这是我试图避免的不惜一切代价,我不想冒搞砸事情和丢失数据的风险,无论可能性有多大。

最佳答案

  1. map(takexor, magicpotato) - 这可能最好通过直接迭代来完成,如果 map 需要调用其他Python代码,AFAIK,它的效率不高,它需要构造和销毁16384个帧对象来执行调用等等

  2. 使用数组模块代替结构体

  3. 如果它仍然太慢,请使用 cython 编译它并添加一些静态类型(这可能会使它快 2-3 个数量级)

关于python - 使用 python 处理磁盘中的大量数据的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4507545/

相关文章:

python - 使用 google 实现 SSO + OAuth

python - matplotlib:如何在不在开头和结尾剪裁 NaN 的情况下绘制日期

c - 有哪些重构方法可以减少编译代码的大小?

c# - Emgu CV制作透明背景

c++ - C++将打包的二进制文件打印到标准输出

python - 在 Python 中绘制向量数组 (pyplot)

Python 3 生成器理解生成 block ,包括最后

c# - 如何进一步优化此代码?

c++ - 与神秘指针相关的多线程速度减慢

ruby - Ruby net/scp,从变量上传文件