减去HDF5文件数据集元素的最快方法?

嘿大家:
这是一个有趣的问题。
输入:
输入是在数据集-1和HDF5文件中存储的两个数组(NX4,在第2列中排序)(INPUT.H5)。 n是巨大的(最初属于10 GB的文件,因此存储在HDF5文件中)。
输出:
从DataSet-1中减去DataSet-2的每个列2元素,以使差异(Delta)在+/- 4000之间。最终将此信息保存在新的HDF5文件的DSET中。我需要参考这个新文件来回,因此HDF5不是文本文件。
关心:
我最初使用了.ppend方法,但这崩溃了10GBS输入的执行。因此,我现在使用dset.tsizize方法(最好坚持使用)。我也在使用二进制搜索,正如我在最后一篇文章中被告知的那样。因此,现在,尽管该脚本似乎正在为大型(10 GB)数据集工作,但它非常慢!扣除(对于/while)循环可能是罪魁祸首!
关于我如何使它快速做出的任何建议?
我的目标是使用最快的方法(可能是最简单的方法,因为我是初学者)。

选择 | 换行 | 行号
  1. f_r = h5py.File('input.h5', 'r+')
  2. dset1 = f_r.get('dataset_1')
  3. dset2 = f_r.get('dataset_2')
  4. r1,c1 = dset1.shape
  5. r2,c2 = dset2.shape
  6. left, right, count = 0,0,0; W = 4000  # Window half-width ;n = 1
  7. f_w = h5py.File('data.h5', 'w')
  8. d1 = np.zeros(shape=(0, 4))
  9. dset = f_w.create_dataset('dataset_1', data=d1, maxshape=(None, None), chunks=True)
  10.  
  11. for j in range(r1):
  12.     e1 = dset1[j,1]
  13.  
  14.     # move left pointer so that is within -delta of e
  15.     while left < r2 and dset2[left,1] - e1 <= -W:
  16.         left += 1
  17.     # move right pointer so that is outside of +delta
  18.     while right < r2 and dset2[right,1] - e1 <= W:
  19.         right += 1
  20.  
  21.     for i in range(left, right):
  22.         delta = e1 - dset2[i,1]
  23.         dset.resize(dset.shape[0] + n, axis=0)
  24.         dset[count, 0:4] = [count, dset1[j,1], dset2[i,1], delta]
  25.         count += 1
  26.  
  27. print("\nFinal shape of dataset created: " + str(dset.shape))
  28.  
  29. f_w.close()
# 回答1


F_R没有关闭。
如果它没有关闭文件,代码可能会放慢速度,则不会在RAM中释放空间,并且会影响性​​能。
# 回答2


我最后使用" f_r.close()"将其关闭,但没有改变任何东西。还有其他建议吗?
# 回答3


使用后立即关闭F_R怎么样?
F_R的使用以第一行结束。
# 回答4


我也尝试了。它给出了一个错误" ValueError:不是数据集(不是数据集),在第12行中E1要求DSET1。
我无法将dataset_1和dataset_2直接传输到列表/numpy数组,因为数据集_1或2确实很大。
还有其他想法吗?
# 回答5


第9行是用f_w编写的。这是好吗?
在f_w.close()之前,它需要f_w.flush()。
# 回答6


是的,第9位似乎很好。 F_W提供了一个文件对象。基本上,我正在创建一个新的" data.h5",该新" data.h5"保存在第24行中。
我还可以将第9行更改为:dset = f_r.create_dataset('dataset_3',data = d1,maxShape =(none,none),块= true)
这个(而不是创建新的HDF5文件),而是在Input.h5中创建一个新的DataSet3;但是计算时间没有影响。
我的怀疑是可以改善24/循环节省数据的方式,但不确定,因为我不是编程专家。
# 回答7


N集的值在哪里?
它看起来像是第6行上的" n = 1"。

选择 | 换行 | 行号
  1. left, right, count = 0,0,0; W = 4000  # Window half-width ;n = 1

请告诉我有关您要执行的DSET行中元素数量的变化。
在某些情况下,它可能能够在外部循环外移动23行。

# 回答8


因此,这就是正在发生的事情:
1.我在第9行上选择一个灵活的形状dset;弹性时,我正在处理大型数组,并且可能随输入文件大小而变化
2.我在第24行中填写了一些感兴趣的值
3.在第23行,我基本上将DSET的当前大小扩展到n(= 1)。添加的行填充了我在第24行中创建的值。
简而言之,我 m每次将其行附加1时生成一些数字(第22行)并填充DSET。
当您说"外部循环外23行"时,您能详细说明吗?
我检查的一件事是,即使在第23行和第24行进行评论时(这意味着我只是在第22行中创建值,而不是在DSET中存储),但计算时间仍然很大(慢)。因此,移出第23行可能不会改变执行速度。
# 回答9


我再次写信,
在第6行中,n = 1被禁用。
只有以下部分有效
左,右,计数= 0,0,0; W = 4000
这是这里的评论。
#窗户的宽度一半。 n = 1
因此,未调整第23行。
相反,通过添加不确定的变量,执行可能不稳定。
如果显示的代码是整体的一部分,而n = 1在第6行以外的非档案部分中设置为" n = 1",则第23行的最大行尺寸为(右左+1)。
如果您写入文件的DSET的行尺寸比初始大小大于文件,则只需将其调整一次外部以进行循环以进行循环。
# 回答10


嘿Siosio,
感谢你的协助。因此," n"只是这里的错别字。但是我解决了这个问题。事实证明,Pytables的" Append"方法比调整HDF5文件的大小要快得多。如果有人在以后停下来,只是想在这里提及!
感谢你的宝贵时间!

标签: python

添加新评论