【问题标题】:Persisting data in Google Colaboratory在 Google Colaboratory 中持久化数据
【发布时间】:2018-04-21 23:42:09
【问题描述】:

有没有人想办法让文件在 Google 的 newly open sourced Colaboratory 中的会话中保持持久化?

使用示例笔记本,我成功地从我的 Google Drive 实例验证和传输 csv 文件,并将它们存储在 /tmp、我的 ~ 和 ~/datalab 中。 Pandas 也可以从磁盘上很好地读取它们。但是一旦会话超时,看起来整个文件系统都被擦除了,一个新的虚拟机启动了,没有下载文件。

鉴于 Google 的 Colaboratory Faq,我想这并不奇怪:

问:我的代码在哪里执行?如果我关闭浏览器窗口,我的执行状态会怎样?

答:代码在专用于您帐户的虚拟机中执行。虚拟机在空闲一段时间后会被回收,并具有系统强制执行的最长生命周期。

鉴于此,也许这是一个功能(即“使用 Google Cloud Storage,它在 Colaboratory 中运行良好”)?当我第一次使用该工具时,我希望 My File/Colab Notebooks Google Drive 文件夹中的任何 .csv 文件也能加载到笔记本正在运行:/

【问题讨论】:

标签: python google-colaboratory


【解决方案1】:

你的解释是正确的。虚拟机是短暂的,并且在一段时间不活动后会被回收。目前在 VM 本身上没有持久数据的机制。

为了使数据持久存在,您需要将其存储在 VM 之外的某个位置,例如 Drive、GCS 或任何其他云托管提供商。

I/O example notebook 中提供了一些用于从外部源加载和保存数据的方法。

【讨论】:

    【解决方案2】:

    Clouderizer 可能会提供一些数据持久性,但代价是设置时间较长(因为您仅将 google colab 用作主机)并且工作空间很小。

    但是,在我看来,当您忘记保存进度时,最好不要“回收”您的文件。

    【讨论】:

      【解决方案3】:

      不确定这是否是最佳解决方案,但您可以通过自动身份验证在 Colab 和 Drive 之间同步数据,如下所示:https://gist.github.com/rdinse/159f5d77f13d03e0183cb8f7154b170a

      【讨论】:

        【解决方案4】:

        正如您所指出的,Google Colaboratory 的文件系统是短暂的。有一些变通方法,尽管存在网络延迟损失和代码开销:例如您可以在笔记本中使用样板代码来安装外部文件系统,例如 GDrive(请参阅他们的 example notebook)。

        另外,虽然 Colaboratory 不支持此功能,但其他 Jupyter 托管服务(如 Jupyo)会提供具有持久文件系统的专用 VM,以便数据和笔记本在会话中保持不变。

        【讨论】:

          【解决方案5】:

          把它放在你的代码之前,所以在运行你的代码之前总是会下载你的文件。

          !wget -q http://www.yoursite.com/file.csv
          

          【讨论】:

          • 我不敢相信这没有得到足够的支持。虽然我更喜欢!wget -o file.csv http://www.example.com/file.csv
          【解决方案6】:

          如果有人对保存和恢复整个会话感兴趣,这里有一个我正在使用的 sn-p,您可能会觉得有用:

          import os
          import dill
          from google.colab import drive
          
          backup_dir = 'drive/My Drive/colab_sessions'
          backup_file = 'notebook_env.db'
          backup_path = backup_dir + '/' + backup_file
          
          def init_drive():
            # create directory if not exist
            drive.mount('drive')
            if not os.path.exists(backup_dir):
              !mkdir backup_dir
          
          def restart_kernel():
            os._exit(00)
          
          def save_session():
            init_drive()
            dill.dump_session(backup_path)
          
          def load_session():
            init_drive()
            dill.load_session(backup_path)
          

          编辑:在您的会话大小不太大之前可以正常工作。你需要检查它是否适合你..

          【讨论】:

            【解决方案7】:

            我有兴趣在单独的 .py 文件中导入模块。

            我最终将 .py 文件内容复制到笔记本的第一个单元格中,并在第一行添加以下文本:

            %%writefile mymodule.py
            

            这会在工作目录中创建一个名为 mymodule.py 的单独文件,以便您的笔记本可以将其与导入行一起使用。

            我知道通过运行模块中的所有代码可以使用笔记本中的变量和函数,但是我的代码需要导入模块,所以这对我来说已经足够了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-06-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多