我正在将CSV文件写入HDF5文件,以便在不占用内存的情况下以更好的方式加载信息。我的CSV文件包含要通过字典转换为相应值的索引。
CSV文件很大(索引的值为4 GB),并且相应的值为512
大小的数组。要创建数据集,我首先在H5文件中定义数据集,然后逐块读取CSV文件,以便它使用适当数量的RAM
num_lines = 1000000
chunksize = 100000
num_features = 512
with h5py.File('./data/dataset.h5', 'w') as h5f:
# use num_features-1 if the csv file has a column header
dset1 = h5f.create_dataset('paragraph_embeddings',
shape=(num_lines, num_features),
compression=None,
dtype='float32')
dset2 = h5f.create_dataset('sentence_embeddings',
shape=(num_lines, num_features),
compression=None,
dtype='float32')
dset3 = h5f.create_dataset('labels',
shape=(num_lines,),
compression=None,
dtype='int32')
# Read csv in chunks so that RAM does not overflow
for i in range(0, num_lines, chunksize):
df = pd.read_csv(csv_path,
header=None,
nrows=chunksize, # number of rows to read at each iteration
skiprows=i) # skip rows that were already read
df.columns = ["para_index", "sentence_index", "label"]
# Get embeddings from dictionaries (para_mappings and sentence_mappings)
paragraph_embeddings = df["para_index"].map(para_mappings)
sentence_embeddings = df["sentence_index"].astype(str).map(sentence_mappings)
label = df["label"]
# Append to the datasets
dset1[i:i+chunksize, num_features:] = paragraph_embeddings
dset2[i:i+chunksize, num_features:] = sentence_embeddings
dset3[i:i+chunksize] = label
我使用df.map
函数将索引映射到其相应的值。在那之后,我得到了嵌入(或如前所述的512
大小的数组)。之后,我将它们附加到其相应的数据集。
但是,为了测试,我使用以下命令从H5文件中打印嵌入内容:
with h5py.File('./data/dataset.h5', 'r') as h5f:
print('Embedding', h5f['paragraph_embeddings'][2])
并且我得到一个零数组(大小为512
)作为输出。
有人可以引导我在这里出问题吗?根据我的估计,应该是将嵌入“附加”到数据集的地方。我认为,我不是要附加这些值并在那里做错什么。
而且,当我测试标签时,它们出来是正确的。所以,我想,这主要是在这一行强调我的问题:
dset1[i:i+chunksize, num_features:] = paragraph_embeddings
问题出在这一行:
paragraph_embeddings = df["para_index"].map(para_mappings)
这给了我一个数据块大小的数据帧,每个元素都是一个numpy数组(大小为512)。当我将其写入数据集中时,将数据输入为以下形式是不接受的:
dset1[i:i+chunksize] = paragraph_embeddings
给我一个错误,说它无法将大小为chunk-size
的数据输入大小为[chunk-size, 512]
的数据集中。这给了我一个线索,先将数据框转换为[chunk-size, 512]
形状的numpy数组,然后将其添加到数据集中。如预期那样有效。
paragraph_embeddings = np.array(df["para_index"].map(para_mappings).tolist())