Julia Package DataFrames 1.6.1 无法识别旧版本 DataFrames 1.3.4 文件

问题描述 投票:0回答:1

我通过 Julia 序列化创建了一个文件,该文件位于 DataFrames 1.3.4 上。 现在包DataFrames的新版本是1.6.1。 但是当使用 DataFrames 1.6.1 时,julia 无法识别旧版本的 DataFrames 1.3.4 文件。 所以我必须将 DataFrames 版本固定到旧版本。 能解决吗

旧版本文件链接如下。 https://github.com/andyname/ADiGit/blob/214acca242c5a51bee17cf58d01fc5b9eabc11d4/NAL_IDv3723v3765vSI_WON_IDv20642120v20924959.cs

package julia dataframes.jl
1个回答
0
投票

Julia 中的序列化是一种短期存储格式。我引用了文档(您可以阅读源代码here):

数据格式可能会在次要 (1.x) Julia 版本中发生更改,但之前 1.x 版本写入的文件将保持可读。主要的例外是外部包中类型的定义发生更改时。如果发生这种情况,可能需要在您的环境中指定受影响的包的显式兼容版本。重命名包内的函数,甚至是私有函数,也会使现有文件不同步。匿名函数需要特别小心:因为它们的名称是自动生成的,微小的代码更改可能会导致它们被重命名。在用于长期存储的文件中应避免序列化匿名函数。

在某些情况下,读写机器的字长(32 位或 64 位)必须匹配。在极少数情况下,操作系统或架构也必须匹配,例如当使用包含平台相关代码的包时。

简而言之 - 您不应该假设当您在不同平台/操作系统/Julia/包版本之间移动序列化数据时,它们可以再次读回。

假设平台、操作系统和 Julia 版本保持不变,但只有 DataFrames.jl 版本发生变化,你可以做什么,我也假设你是:

  • 在你的
    DataFrame
    中使用标准 Julia 类型(如果没有,那么更改提供这些类型的包的版本也会导致相同的问题)
  • 您不使用元数据(这是对未来读者的额外评论,在 DataFrames.jl 1.3.4 中不支持元数据)。

在这些条件下,最简单的做法是:

  1. 在您的项目环境中安装 DataFrames.jl 1.3.4。
  2. 反序列化旧数据帧,例如到
    df
    变量。
  3. 通过写入
    NamedTuple
     将此数据帧转换为 
    nt = Tables.columntable(df)
  4. 序列化
    nt
  5. 重新启动 Julia 会话并使用 DataFrames.jl 1.6.1 启动一个新项目。
  6. 反序列化文件存储
    nt
  7. 重新创建数据框
    df = DataFrame(nt)

此过程之所以有效,是因为我们回退到标准 Julia 类型 (

NamedTuple
),它将在同一平台、操作系统和 Julia 版本上正确序列化/反序列化。

现在,为什么这么复杂?原因是序列化不是 DataFrames.jl 的一部分。这是标准的 Julia 机制,不知道 DataFrames.jl 包的存在。

将来您可能会考虑将数据存储在例如Arrow.jl 格式。这种格式独立于 Julia 或 DataFrames.jl,因此它应该是稳定的(作为奖励,您可以在其他生态系统(例如 Python 或 R)中加载/保存这种格式的文件)。

© www.soinside.com 2019 - 2024. All rights reserved.