如何将可变大小的数据保存到 H5PY 文件?

How to save variable-sized data to H5PY file?

我使用的数据集太大,无法放入内存进行计算。为了避免这个问题,我正在分批计算并再次将结果保存到文件中。

我遇到的问题是我的最后一批不会保存到我的 H5py 文件中,几乎可以肯定是因为结束的批大小与之前的所有批大小不同。有什么方法可以让 chunks 更灵活吗?

考虑以下 MWE:

import h5py
import numpy as np
import pandas as pd
from more_tools import chunked

df = pd.DataFrame({'data': np.random.random(size=113)})
chunk_size = 10
index_chunks = chunked(df.index, chunk_size)

with h5py.File('SO.h5', 'w') as f:
    dset = f.create_dataset('test', shape=(len(df), ), maxshape=(None, ), chunks=True, dtype=np.float32)

    for step, i in enumerate(index_chunks):
        temp_df = df.iloc[i]
        dset = f['test']
        start = step*len(i)
        dset[start:start+len(i)] = temp_df['data']
        dset.attrs['last_index'] = (step+1)*len(i)
# check data
with h5py.File('SO.h5', 'r') as f:
    print('last entry:', f['test'][-10::])  # yields 3 empty values because it did not match the usual batch size

您的索引有误。 step, i 是这样的:

 0,   0 ...   9
 1,  10 ...  19
 2,  20 ...  29
...
 9,  90 ...  99
10, 100 ... 109
11, 110 ... 112

对于 step == 11len(i) == 3。这使得 start = step * len(i) 变为 11 * 3 == 33,而你期望 11 * 10 == 110。您只是写错了位置。如果检查第四块中的数据,您可能会发现第四、第五和第六个元素被丢失的数据覆盖。

这是一个可能的解决方法:

last = 0
for step, i in enumerate(index_chunks):
    temp_df = df.iloc[i]
    dset = f['test']
    first = last
    last = first + len(i)
    dset[first:last] = temp_df['data']
    dset.attrs['last_index'] = last