【问题标题】:Pickle.dump(obj) dumps two lists that conatain exactly the same values but dump file has a diffrent sizePickle.dump(obj) 转储两个包含完全相同值但转储文件大小不同的列表
【发布时间】:2019-08-20 11:15:27
【问题描述】:

我正在创建进行大量独立计算的软件的并行化,以便研究所不需要 6 小时来计算一次运行。这些结果保存在数组列表中。数组长度是静态的。然后用 pickle.dump(obj) 转储此列表。

区别在于单线程的大小为 6.5 KiB 而多线程的大小为 20,4 KiB

首先: 我做了我的研究,是的,你不应该使用泡菜,但大学就是大学。我还测试了我的多线程实现,我在最后几天这样做了,我什至用手比较了一个较小的样本来确定,所以当你建议我应该检查我的多线程实现时,我没有帮助。

现在我做了什么: 首先,比较所有元素,在单线程和多线程创建的列表之间,它们是相同的。比较长度、形状,sys.getsizeof(obj) 是一样的。 然后我查看了 pickle.dump(obj),它自己选择协议,所以我尝试使用不同的协议。我得到了不同的结果,但不是我预期的更小。

最后,我检查了我是否真的只转储列表,是的,只转储列表。

正如上面所写,人们期望为完全相同的列表获得完全相同的转储文件大小,那么为什么没有发生这种情况呢?

是的,我是新来的,没有掌握所有规则,所以请就如何改进问题提供适当的反馈。

【问题讨论】:

  • 解开两个文件时是否得到相同的列表?如果它们不相同,则说明您的多线程代码有问题。
  • 是的,我解开它们并得到相同的文件。
  • 听起来很奇怪,但两个列表最终相等才是最重要的,不是吗?我会将此归咎于泡菜的实施并继续前进。如果您想对此进行调查,最好提供minimal reproducible example
  • 遗憾的是它不是,因为更大的转储会导致处理的后续步骤变慢,让我很长时间感到困惑......

标签: python python-3.x list pickle


【解决方案1】:

所以解决方案相当简单......

我还应该检查数组中元素的类型。在晚上的编码部分,我使用 numpy 将列表与计算值进行分区,并完全忘记了它。

使用简单的 array.tolist() 解决了这个问题。

结论: 即使在 python 中检查你的类型!

【讨论】:

  • 喝了杯咖啡,听说大学正在讨论 python numpy 类型的问题......
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 2010-11-07
  • 2021-11-01
  • 2016-06-28
  • 2016-03-16
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多