gpt4 book ai didi

python - 如何在不复制底层数据的情况下序列化多个 numpy View (即具有共享数据的数组)?

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:27 24 4
gpt4 key购买 nike

我发现在对同一数据保存多个 numpy View 时,cPickle 会复制共享数据。

例如:

import cPickle
import numpy as np
a = np.arange(1000000)
b = [a[i:] for i in range(100)]
with open('C:/temp/b.pkl', 'wb') as f:
cPickle.dump(b, f, protocol=1)

这会生成一个 400MB 的文件,这意味着 cPickle 正在复制由列表 b 中的所有 View 共享的缓冲区(否则它将约为 4MB)。

我希望能够在不复制数据的情况下进行序列化,以便 (a) 文件大小更小,并且 (b) 当我反序列化时,我可以恢复 View 的共享数据状态。

提前致谢

最佳答案

你告诉它保存b,这是一个列表[a[i:] for i in range(100)]。列表的 pickle 方法遍历列表并为每个元素调用 pickle。每个 a[i:] 都是一个不同的 numpy 数组;每个都是一个 View ,共享 a 的底层数据缓冲区,但是元数据,形状,步幅和 dtype 之类的东西是不同的。因此,每个列表元素(数组)都将在不“了解”之前保存的内容的情况下进行 pickle 。

如果你想让它更紧凑地保存列表,你将需要创建一个类,它有自己的 pickle 方法。该方法可以在知道那些 a[...] 共享底层数据缓冲区的情况下运行。或者它可能会保存 a 和重新创建此列表所需的数据。

简而言之,您的 pickled 变量很大,因为 pickle 方法对列表的深层结构一无所知。

关于python - 如何在不复制底层数据的情况下序列化多个 numpy View (即具有共享数据的数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31612592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com