Python 在 OS X 和 Linux 之间的 Pickle 差异(在 Pandas DataFrame 对象上)

Python's Pickle differences between OS X and Linux (over Pandas DataFrame object)

我使用 to_pickle.

将 OS X 上的 DataFrame 导出到 pickle

将其重新加载到 OS X(使用 read_pickle)returns 与预期相同 DataFrame,但将其加载到 Linux 系统( Debian) 使用相同的功能returns 不同的内容。

从几个帖子看来 pickle 在使用 二进制模式 时保证是跨平台的(参见:Is pickle file of python 跨平台?),但是 to_pickleread_pickle 不接受任何参数,我无法从他们的文档中判断它是否默认为二进制。

我怎么知道它们是不是?

如何确保我的 pickle 文件在各个平台上都相同?

备注:

这是使用 to_pickle 创建的 .pickle 文件的一部分:

945d 948c 055f 6461 7461 948c 1570 616e
6461 732e 636f 7265 2e69 6e74 6572 6e61
6c73 948c 0c42 6c6f 636b 4d61 6e61 6765
7294 9394 297d 9492 9428 5d94 288c 1370

使用 b 前缀导出它(df.to_pickle(b'pickle_folder/df.pickle' 而不是 df.to_pickle('pickle_folder/df.pickle')不会改变它的内容。

两个 python 版本相同 (3.4.4)。

编辑

从他们的 source code 看来,他们使用的似乎是最高级别的协议和二进制文件 reading/writing。这回答了我的第一个问题。仍在寻找它们在平台之间不同的原因。

我不能直接回答你的问题:

why they are different between platforms?

但作为一种解决方法,您可以使用标准 HDF5 format,它适用于所有平台并且具有不错的功能:

  • 能够使用 where='where clause' 参数只读取满足条件的那部分数据(这些列必须被索引 - 检查 data_columns 参数)。所以你可能在 HDF5 文件中有大量数据,你可以分块处理它,有效地将块读取(使用索引)到内存中。 IE。你不需要从磁盘读取所有数据来过滤它。
  • 压缩数据的能力(例如使用非常快速且非常有效的压缩算法:blosc

存储和读取 to/from HDF5 文件可能非常快,具体取决于使用的数据类型。注意:与 Pickle 格式相比,使用字符串 (dtype: object) 可能要慢得多。

另一个标准选项是使用中央数据库,它应该适用于所有平台,并让您有可能在数据库服务器端对数据进行(预)过滤和排序。