我不明白为什么保存的10000 X 10000 X 7大小的Numpy数组dtype=np.float16是1.4gb,而等效的pickle Python列表大约是500mb。我希望Python pickle列表会比Numpy数组大。
在Python中,我有一个名为all_games的列表,每个列表包含7个子元素float值。
然后使用以下函数从all_games中采样:
def sample_games(all_games, file_name):
all_games = np.array(all_games, dtype=np.float16)
DRAW = 10000
SAMPLE = 10000
# Generate random indices for the sample
sampled_indices = rng.choice(all_games.shape[0], size=(SAMPLE, DRAW), replace=True)
# Get all sub-elements from randomly sampled indices
sampled_data = all_games[sampled_indices]
file_name = '***'
np.save(file_name, sampled_data)
字符串
这将保存一个1.4GB大小的10000,10000,7 Numpy数组。
如果我不将列表转换为Numpy数组,而是使用以下函数:
def sample_games(all_games, file_name):
DRAW = 10000
SAMPLE = 10000
# Generate random indices for the sample
# Get all sub-elements from randomly sampled indices
sampled_data = [[random.choice(all_games) for _ in range(DRAW)] for _ in range(SAMPLE)]
file_name = '***'
with open(file_name, 'wb') as file:
pickle.dump(sampled_data, file)
型
pickle列表是500MB。
有人能解释一下为什么保存的Numpy数组比等效的pickle列表大大约900mb,以及如何将保存的Numpy数组缩小到小于等效的pickle列表的大小吗?
1条答案
按热度按时间zsohkypk1#
NumPy不会压缩,你会得到原始的10000×10000×7×16位= 1.4 GB。你可以尝试numpy.savez_compressed。
Pickle也不会压缩,但是你会重复引用
all_games
中相同的内部7元素列表对象,而pickle不会重复显式存储它们。尝试sampled_data = [[random.choice(all_games).copy() for _ in range(DRAW)] for _ in range(SAMPLE)]
(我刚刚添加了.copy()
),看看当它不能利用这一点时会发生什么,你可能最终会得到4.4 GB。