尝试缓存 s3 文件
Attempting to Cache s3 files
我有两条管道 运行。第一个管道从 s3 读取文件并进行一些处理并更新文件。第二个管道 运行s 多个作业,对于每个作业,我从 s3 下载文件并产生一些输出。我觉得我通过多次下载在我的第二个管道上浪费了很多时间,因为当我将它们用于多个作业时我目前不缓存这些文件。因此,鉴于此,我正在尝试在本地缓存 s3 文件。
我做了一些研究,发现 s3fs or fsspec 可以使用。到目前为止,我可以使用 s3fs 从 s3 下载并打开文件,但我不确定如何在本地缓存它。
import s3fs
import pandas as pd
FS = s3fs.S3FileSystem()
file = FS.open('s3://my-datasets/something/foo.csv')
# of = fsspec.open("filecache::s3://bucket/key", s3={'anon': True}, filecache={'cache_storage'='/tmp/files'})
df = pd.read_csv(file, sep='|', header=None)
print(df)
正如您在上面的代码中看到的,我正在从 s3 打开一个文件,然后将其读入数据帧。现在我想知道是否有参数或我可以传递的东西以便缓存此文件。
另一种方法当然是我可以检查文件是否存在于某个路径中,如果存在则使用它,如果不存在则下载它,但我觉得必须有更好的方法来进行缓存。我愿意接受任何和所有的建议。
Amazon S3 是一种对象存储服务,可以通过经过身份验证的 API 请求进行访问。
s3fs
等工具将 Amazon S3 呈现为文件系统,但它们需要将此类用法转换为正常的 S3 API 调用。当在 S3 或本地 s3fs 虚拟磁盘中进行大量更新时,更新另一端可能需要一些时间,并且在高使用率情况下它们可能会变得不同步。
s3fs 保留文件缓存这一事实意味着文件可能会更快地变得不同步,具体取决于它返回并检查 S3 中的内容是否已更改的频率。
这基本上是在您的应用程序和 S3 之间增加了另一层复杂性。如果你能直接去,它总是会更可靠。但是,这意味着您可能需要自己实现一些有用的功能。
如果您打算在生产环境中使用它,我建议您创建一个测试平台来模拟适当的使用级别,以确认所有系统都按预期工作。
您可以使用 s3fs 和 fsspec 在本地缓存 S3 文件:
https://filesystem-spec.readthedocs.io/en/latest/features.html#caching-files-locally
文档中的两个示例对我来说都很好用。似乎您实际上有第二个选项,因为您的示例中注释掉了代码。这对你不起作用吗?
无论如何,你的第一个例子是
import pandas as pd
import fsspec
fs = fsspec.filesystem("filecache", target_protocol='s3', cache_storage='/tmp/files/', check_files=True)
with fs.open('s3://my-datasets/something/foo.csv') as file:
df = pd.read_csv(file, sep='|', header=None)
我有两条管道 运行。第一个管道从 s3 读取文件并进行一些处理并更新文件。第二个管道 运行s 多个作业,对于每个作业,我从 s3 下载文件并产生一些输出。我觉得我通过多次下载在我的第二个管道上浪费了很多时间,因为当我将它们用于多个作业时我目前不缓存这些文件。因此,鉴于此,我正在尝试在本地缓存 s3 文件。
我做了一些研究,发现 s3fs or fsspec 可以使用。到目前为止,我可以使用 s3fs 从 s3 下载并打开文件,但我不确定如何在本地缓存它。
import s3fs
import pandas as pd
FS = s3fs.S3FileSystem()
file = FS.open('s3://my-datasets/something/foo.csv')
# of = fsspec.open("filecache::s3://bucket/key", s3={'anon': True}, filecache={'cache_storage'='/tmp/files'})
df = pd.read_csv(file, sep='|', header=None)
print(df)
正如您在上面的代码中看到的,我正在从 s3 打开一个文件,然后将其读入数据帧。现在我想知道是否有参数或我可以传递的东西以便缓存此文件。
另一种方法当然是我可以检查文件是否存在于某个路径中,如果存在则使用它,如果不存在则下载它,但我觉得必须有更好的方法来进行缓存。我愿意接受任何和所有的建议。
Amazon S3 是一种对象存储服务,可以通过经过身份验证的 API 请求进行访问。
s3fs
等工具将 Amazon S3 呈现为文件系统,但它们需要将此类用法转换为正常的 S3 API 调用。当在 S3 或本地 s3fs 虚拟磁盘中进行大量更新时,更新另一端可能需要一些时间,并且在高使用率情况下它们可能会变得不同步。
s3fs 保留文件缓存这一事实意味着文件可能会更快地变得不同步,具体取决于它返回并检查 S3 中的内容是否已更改的频率。
这基本上是在您的应用程序和 S3 之间增加了另一层复杂性。如果你能直接去,它总是会更可靠。但是,这意味着您可能需要自己实现一些有用的功能。
如果您打算在生产环境中使用它,我建议您创建一个测试平台来模拟适当的使用级别,以确认所有系统都按预期工作。
您可以使用 s3fs 和 fsspec 在本地缓存 S3 文件: https://filesystem-spec.readthedocs.io/en/latest/features.html#caching-files-locally
文档中的两个示例对我来说都很好用。似乎您实际上有第二个选项,因为您的示例中注释掉了代码。这对你不起作用吗?
无论如何,你的第一个例子是
import pandas as pd
import fsspec
fs = fsspec.filesystem("filecache", target_protocol='s3', cache_storage='/tmp/files/', check_files=True)
with fs.open('s3://my-datasets/something/foo.csv') as file:
df = pd.read_csv(file, sep='|', header=None)