如何将可变大小的数据保存到 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 == 11
、len(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
我使用的数据集太大,无法放入内存进行计算。为了避免这个问题,我正在分批计算并再次将结果保存到文件中。
我遇到的问题是我的最后一批不会保存到我的 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 == 11
、len(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