Alex Gaynor在他的演讲"Pickles are for delis, not software"中解释了pickle的一些问题,包括安全性,可靠性和可读性。我通常对在python程序中的数据上使用pickle持谨慎态度。通常,我更喜欢手动使用json或我自己指定的其他序列化格式传递数据。
我感兴趣的情况是:我已经在python程序中收集了一些数据,并且我想并行执行多次令人尴尬的并行任务。
据我所知,目前在python中执行此操作的最好的并行化库是dask-distributed,其次是joblib-parallel,current.futures和multiprocessing。
但是,所有这些解决方案都使用pickle进行序列化。考虑到pickle的各种问题,我倾向于将json数组发送到GNU parallel
的子进程中。但是,当然,这感觉像是一种破解,并且失去了Dask的所有看中优点。
是否可以为我的数据指定不同的默认序列化格式,但是可以继续在python中进行并行化,最好是dask,而不必使用pickle或gnu parallel?
答案 0 :(得分:2)
第http://distributed.dask.org/en/latest/protocol.html页值得一读,有关Dask如何在一组分布式工作程序和调度程序周围传递信息。可以看出,(cloud)pickle进入了诸如函数之类的事物的图片,我们希望将其传递给工作人员,以便他们可以执行它们,但是数据通常是通过相当有效的msgpack序列化发送的。将无法使用JSON序列化功能。实际上,有一个相当灵活的内部调度机制来决定将什么序列化为哪种机制,但是这里无需赘述。
我还声称,泡菜是在进程之间传递时对某些事物进行序列化的一种 fine 方法,只要您为确保它们之间的环境一致而烦恼,就可以假设达斯使。
-编辑-
您当然可以在JSON中包含功能名称或转义符,但是无论如何我还是建议它像泡菜一样脆弱。
答案 1 :(得分:0)
泡菜不利于长期存储(“如果将类持久化后我的类定义发生变化,该怎么办?”)并且很难接受作为用户输入:
def foo():
os.system('rm -rf /')
return {'lol': foo}
但是我认为在这种特定情况下使用它们根本没有任何问题。假设您要传递datetime
个对象。您是否真的想编写自己的JSON适配器来序列化和反序列化它们?我的意思是,您可以,但是您想要吗?腌制食品有很好的说明,并且过程很快。这正是您想要的,您既不保留中间序列化对象,也不接受第三方的对象。您实际上是在将它们从自己传递给自己。
我强烈建议您选择要使用的库-您喜欢Dask吗?去吧! -直到您特别需要关心的时候才担心它的内在性。同时,集中精力解决程序中与问题无关的部分。基础序列化格式不是其中之一的可能性很好。