在Google Colaboratory中持久化数据

41

有人找到了一种方法来在 Google 的新开源的 Colaboratory中跨会话保留文件吗?

使用示例笔记本,我已成功地将 csv 文件从我的 Google Drive 实例进行身份验证和传输,并将它们存储在 /tmp, my ~ 以及 ~/datalab 中。Pandas 也可以从磁盘上读取它们。但是一旦会话超时,似乎整个文件系统都被清除,并且重新创建了一个新的 VM,未下载的文件也消失了。

考虑到谷歌的Colaboratory Faq,这并不奇怪:

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

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

考虑到这一点,这可能是一项功能(即“使用 Colaboratory 中运行良好的 Google Cloud 存储”)?当我第一次使用该工具时,我确实希望位于我的文件/ Colab 笔记本 Google Drive 文件夹中的任何 .csv 文件也加载到笔记本正在运行的 VM 实例中 :/


请查看 https://stackoverflow.com/a/68411774/1812732。 - John Henckel
8个回答

33

将这段代码放在你的代码之前,这样你的文件将始终在运行代码之前被下载。

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

1
我简直不敢相信这个没有得到足够的赞。虽然我更喜欢使用!wget -o file.csv http://www.example.com/file.csv - Xwtek
3
这适用于Google Drive文件吗? - Jacob Waters

17

您的理解是正确的。虚拟机(VM)是短暂存在的,会在一段时间的闲置后被回收。目前没有机制可以在虚拟机本身上存储持久性数据。

若要使数据持久化,您需要将其存储在虚拟机外的某个地方,例如Drive、GCS或其他任何云托管提供商。

有关从外部源加载和保存数据的一些步骤,请参阅I/O示例笔记本


6

把下面的代码加入到您谷歌云端硬盘中的文件中:

from google.colab import drive
drive.mount('/content/drive')

运行后,您将在文件选项卡中看到它已挂载,您可以通过以下路径访问您的文件:

'/content/drive/MyDrive/<your folder inside drive>/file.ext'

4

2

Clouderizer 可以提供一些数据持久性,但需要长时间设置(因为您只使用 Google Colab 作为主机),并且工作空间较小。

但是,在我看来,这比在忘记保存进度时使文件被“回收”要好。


2
正如你所指出的那样,Google Colaboratory的文件系统是短暂的。不过,有一些变通方法,虽然会有网络延迟惩罚和代码开销:例如,你可以在笔记本中使用样板代码来挂载外部文件系统,比如GDrive(请参见他们的示例笔记本)。
另外,虽然Colaboratory不支持此功能,但其他Jupyter托管服务(如Jupyo)提供带有持久文件系统的专用VM,因此数据和笔记本在会话之间保留。

0

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

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

%%writefile mymodule.py

这将在工作目录中创建一个名为mymodule.py的单独文件,以便您的笔记本可以使用import语句来调用它。
我知道通过运行模块中的所有代码可以在笔记本中使用变量和函数,但我的代码需要导入一个模块,所以对我来说这已经足够好了。

0

如果有人对保存和恢复整个会话感兴趣,这里是一个我正在使用的代码片段,你可能会觉得有用:

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)

编辑:在您的会话大小不太大的情况下工作正常。您需要检查它是否适用于您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接