当我映射到已安装存储桶中的文件时,如何/何时下载它?

当我映射到已安装存储桶中的文件时,如何/何时下载它?

我正在使用一个可以映射大型资源文件的库。我正在考虑将该资源文件存储在 gcloud 存储桶中,并使用 GCSFuse 使该文件可用于映射,而不是构建自己的解决方案来手动下载文件。

出于性能原因,当我通过 gcsfuse mmap 到 bucket 中的文件时,我想知道文件实际下载的时间:如果 mmap 时一次性下载所有内容,那是理想的。如果在通过 mmapped 指针访问文件的不同部分时下载了块,我想这会因为多次调用 bucket 而变得更慢,如果是这样的话,我可能会使用另一种方法。

答案1

这是一个特定的实现细节,因此请务必阅读文档。截至 6ab0a79 的 README.md 有话要说:

下载对象内容

在后台,当首次修改新打开的文件时,gcsfuse 会从 GCS 下载整个支持对象的内容。内容存储在本地临时文件中,该文件的位置由标志 --temp-dir 控制。稍后,当文件关闭或 fsync 时,gcsfuse 会将本地文件的内容作为新对象生成写回 GCS。

尚未修改的文件将根据需要逐部分读取。gcsfuse 使用启发式方法来检测文件何时被顺序读取,在这种情况下将向 GCS 发出更少、更大的读取请求。

结果是,gcsfuse 在读取或写入整个大文件时效率相对较高,但对于大文件中的少量随机写入,速度不会特别快,对于小的随机读取,速度也会稍慢一些。将大文件复制到 GCS 时的性能与 gsutil 相当(请参阅问题 #22 了解测试说明)。如上所述,由于将数据暂存在本地临时文件中,因此会产生一些开销。

请注意,新文件和修改过的文件也会完全暂存于本地临时目录中,直到它们因关闭或 fsync 而被写入 GCS。因此,用户在写入大文件时必须确保有足够的可用空间来处理暂存内容。

请注意有关下载整个内容的写入、完整对象写入效率更高以及 semantics.md 中令人惊讶的行为。跳过 fuse 文件系统层,使用 GCS SDK 直接读取和写入整个数据块作为存储 blob 会更有效率。但这是此应用使用存储方式的重大变化。

相关内容