繁体   English   中英

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

[英]What's the most efficient way to process massive amounts of data from a disk using python?

我正在编写一个简单的python脚本,以读取失败的RAID5阵列并从中重建数据,而该RAID5阵列无法以任何其他方式进行重建。 我的脚本正在运行,但是运行缓慢。 我的原始脚本以大约80MB / min的速度运行。 此后,我对脚本进行了改进,它以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,loop和浏览文件也没问题),这仍需要很长时间。 我衡量它采取1月中旬与老代码,现在它要采取直到圣诞节(所以它的方式更好,但它仍然比我预期的要慢一些。)

在您询问之前,这是一个mdadm RAID5(64kb块大小,左对称),但是mdadm元数据某种程度上丢失了,并且mdadm不允许您在不将元数据重写到磁盘的情况下重新配置RAID5,我将竭尽全力避免这种情况。 ,我不想冒险搞砸某些东西并丢失数据,但是可能性很小。

  1. map(takexor,magicpotato)-使用直接迭代可能会更好,如果需要调用其他python代码AFAIK,需要构造和销毁16384个框架对象以执行调用,则map效率不高。

  2. 使用数组模块代替struct

  3. 如果仍然太慢,请使用cython进行编译并添加一些静态类型(这可能使其速度提高2-3个数量级)

Google适用于:Widefinder Python。 Python条目中讨论的某些技术可能会有用,例如内存映射IO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM