首页 > 解决方案 > 使用 dill 或 pickle 后无法检索数据

问题描述

我使用 转储了一个 Jupyter Notebook 会话dill.dump_session(filename),有一次它告诉我磁盘存储已满。但是,我在磁盘上腾出一些空间并再次尝试。现在,我无法使用dill.load_session(filename).

我收到以下错误:

~/.local/lib/python3.6/site-packages/dill/_dill.py in load_session(filename, main)
    408         unpickler._main = main
    409         unpickler._session = True
--> 410         module = unpickler.load()
    411         unpickler._session = False
    412         main.__dict__.update(module.__dict__)

 EOFError: Ran out of input

该文件(即文件名)的数据大小约为 30 gigs。

如何从文件中检索我的数据?

顺便说一句,我在 Google Cloud 上运行所有这些,要保持实例正常运行需要花费我一大笔钱。

我尝试过使用undill, 和其他unpickle方法。

例如我试过这个:

 open(file, 'a').close()
      try:
     with open(file, "rb") as Score_file:
            unpickler = pickle.Unpickler(Score_file)
            scores = unpickler.load()
            return scores

但是得到了这个错误:

      `6         with open(file, "rb") as Score_file:
       7             unpickler = pickle.Unpickler(Score_file);
 ----> 8             scores = unpickler.load();
       9 
      10             return scores

   ModuleNotFoundError: No module named '__builtin__'`

标签: python-3.xgoogle-cloud-platformjupyter-notebookpickledill

解决方案


我知道这可能不是您想听到的答案,但是……听起来您的泡菜文件可能已损坏。如果是这种情况,只有手动编辑才能取回数据,并且可以了解腌制字符串是什么以及它们的结构。请注意,在一些非常罕见的情况下,对象会dump,但不会load- 但是,您的文件很可能已损坏。无论哪种方式,分辨率都是相同的......手动编辑是可能保存您腌制的内容的唯一方法。

另外,请注意,如果您使用dump_session,您真的应该使用load_session(因为它在标准之上执行一系列步骤load,颠倒在 中所做的事情dump_session)——这与问题无关,但是,问题可能是不完整或损坏的泡菜文件。


推荐阅读