我正在使用带有一些大中间值的 Dask,并且我从 pickle 中得到错误,如下所示:
error: 'i' format requires -2147483648 <= number <= 2147483647
这是怎么回事?Dask 不支持序列化大于 2GB 的数据块吗?
我正在使用带有一些大中间值的 Dask,并且我从 pickle 中得到错误,如下所示:
error: 'i' format requires -2147483648 <= number <= 2147483647
这是怎么回事?Dask 不支持序列化大于 2GB 的数据块吗?
Dask 有时使用 Pickle 和 Cloudpickle 库来序列化数据。在 Python 2 中,Pickle 有 2GB 的限制。这个问题有几个解决方案:
您可能希望减小块大小以传递每个小于 2GB 的数据位。这也可以帮助您的表现。对于当今的大多数应用程序而言,2GB 块相当大。我个人倾向于拍摄接近 100MB 的块大小。
在 dask.dataframe 中,您通常可以在读取数据时控制块大小,例如使用blocksize=
关键字 in dd.read_csv
(尽管不同的数据摄取方法会有不同的执行方式)。
或者,您可以重新分区数据。
df = df.repartition(npartitions=1000)
Dask 不必使用 Pickle,实际上它通常不需要用于 NumPy 数组等特殊数据类型。有关如何注册自己的序列化函数的信息,请参阅以下文档:
http://distributed.readthedocs.io/en/latest/serialization.html
Python 2 已接近生命的尽头。现在可能是考虑开始使用 Python 3 的好时机,因为这样的许多问题都会迎刃而解。大多数社区库现在都支持 Python 3,甚至比支持 Python 2 更好。
当然,切换可能是一个挑战,尤其是对于大型企业代码库,因此上述其他选项可能在短期内就足够了。