我使用的是一个库,它映射一个大型资源文件。我正在考虑将该资源文件存储在一个gcloud桶中,并使用GCSFuse将该文件用于my,而不是构建自己的解决方案来手动下载该文件。
出于性能方面的考虑,我想知道当我通过gcs引信将文件mmap映射到一个桶中的文件时,文件实际上是何时下载的:如果它是在mmap时一次性下载的,那就太理想了。如果块是在我通过mmapped指针访问文件的不同部分时下载的,我想这会因为多次调用桶而变得更慢,如果是这样的话,我可能会使用另一种方法。
发布于 2019-02-23 14:31:49
这是一个具体的实现细节,所以一定要阅读文档。README.md截至6ab0a79有这样的说法:
在后台下载对象内容时,当新打开的文件第一次被修改时,gcs引信从GCS下载整个支持对象的内容。内容存储在本地临时文件中,其位置由标志--temp-dir控制。稍后,当文件关闭或fsync时,gcs引信将本地文件的内容写回GCS,作为新的对象生成。未修改的文件按需逐部分读取。Gcs引信使用启发式方法检测文件何时按顺序读取,在这种情况下将向GCS发出更少、更大的读取请求。这样做的结果是,在读取或写入整个大文件时,gcs引信的效率相对较高,但对于较大文件中的少量随机写入,速度并不特别快,在较小的程度上,小型随机读取也是如此。将大型文件复制到GCS中时的性能可与gsutil媲美(测试说明见问题22)。如上文所述,由于本地临时文件中数据的暂存,造成了一些开销。请注意,新的和修改过的文件也完全处于本地临时目录中,直到它们由于关闭或fsync而被写入GCS。因此,用户必须确保在编写大文件时有足够的可用空间来处理暂存的内容。
注意关于写下载整个程序、完整对象写入效率更高以及semantics.md中令人惊讶的行为的一点。它将更有效地跳过fuse文件系统层,直接用GCS作为存储块读写整个数据块。但这对这个应用程序使用存储的方式来说是一个重大的改变。
https://serverfault.com/questions/955309
复制相似问题