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

时间:2010-12-22 08:53:12

标签: python optimization binary-data hard-drive raid

我正在编写一个简单的python脚本来读取和重建来自我无法以任何其他方式重建的RAID5阵列的数据。我的脚本运行缓慢。我的原始脚本以大约80MB /分钟的速度运行。我已经改进了脚本,它的运行速度为550MB / min,但仍然有点低。 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]

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

我能做些什么来让这更快/更好吗?如果没有想到什么,我能做些什么来更好地研究是什么让这个变得缓慢? (有没有办法在每行级别对python进行分析?)我是否以正确的方式处理这个问题,还是有更好的方法来处理大量的二进制数据?

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

在你问之前,这是一个mdadm RAID5(64kb blocksize,左对称),但mdadm元数据以某种方式丢失,mdadm不允许你重新配置RAID5而不重写元数据到磁盘,我试图避免不惜一切代价,我不想冒险搞砸某些东西并丢失数据,不管这种可能性是多么遥远。

2 个答案:

答案 0 :(得分:3)

  1. map(takexor,magicpotato) - 这可能更好用直接迭代完成,如果需要调用其他python代码AFAIK,map无效,它需要构造并销毁16384帧对象来执行调用等等。

  2. 使用数组模块而不是struct

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

答案 1 :(得分:0)

Google for:widefinder python。 Python条目中讨论的一些技术可能有用,例如内存映射IO。