我有 n个文件上传到亚马逊S3我需要*搜索*那些基于其内容中出现的字符串的文件,我尝试了一种从S3存储桶下载文件的方法,将输入流转换为字符串,然后搜索单词content ,但是如果它们超过五到六个文件,则执行上述过程需要大量时间,
是他们的任何其他方式来做到这一点,请帮助提前谢谢。
我有 n个文件上传到亚马逊S3我需要*搜索*那些基于其内容中出现的字符串的文件,我尝试了一种从S3存储桶下载文件的方法,将输入流转换为字符串,然后搜索单词content ,但是如果它们超过五到六个文件,则执行上述过程需要大量时间,
是他们的任何其他方式来做到这一点,请帮助提前谢谢。
如果您的文件包含 CSV、TSV、JSON、Parquet 或 ORC,您可以查看 AWS 的 Athena:https ://aws.amazon.com/athena/
从他们的介绍中:
Amazon Athena 是一种快速、经济高效的交互式查询服务,可以轻松分析 S3 中的 PB 级数据,无需管理数据仓库或集群。
不太可能对您有所帮助,因为听起来您有纯文本可供搜索。
我想我会提到它,因为它可能会帮助其他寻求解决类似问题的人。
没有!
如果您无法从对象元数据(例如文件名)中推断出匹配的位置,那么您将不得不手动下载和搜索。如果您有空闲带宽,我建议一次下载几个文件以加快速度。
一句话不!!
我认为您可以提高性能的方法是将文件缓存在本地,这样您就不必一次又一次地下载文件
大概可以用Last-Modified
header检查本地文件是否脏,然后重新下载
由于您似乎拥有这些文件,我的建议是根据内容手动索引它们。如果每个文件都有很多“关键字”或元数据,您可以使用轻量级数据库来帮助自己,您将在其中执行查询并获取用户正在寻找的确切文件。这将保留带宽并且速度更快,但代价是维护一种“索引”系统。
另一种选择(如果每个文件不包含太多元数据)是重新组织您的存储桶中的文件,添加可以“自动索引”它们的前缀,如下所示:
/foo/bar/randomFileContainingFooBar.dat /foo/zar/anotherRandomFileContainingFooZar.dat。
这样,您最终可能会扫描整个存储桶以找到所需的文件集(这就是为什么我仅在元数据很少时才建议使用此选项的原因),但是您只会下载匹配的文件,这仍然要好得多比你原来的方法。
我不熟悉 Amazon S3,但处理搜索远程文件的一般方法是使用indexing,索引本身存储在远程服务器上。这样,每次搜索都将使用索引来推断相对少量的潜在匹配文件,并且只有那些将被直接扫描以验证它们是否确实匹配。根据您的搜索词和模式的复杂性,甚至可以完全避免直接文件扫描。
也就是说,我不知道 Amazon S3 是否有一个您可以使用的索引引擎,或者是否有补充库可以为您做到这一点,但这个概念很简单,您应该能够自己完成一些工作而无需太多工作。
编辑:
通常,每个文件中存在的标记是被索引的。例如,如果您想搜索“foo bar”,索引会告诉您哪些文件包含“foo”,哪些包含“bar”。这些结果的横截面将是同时包含"foo"和"bar"的文件。您必须直接扫描这些文件以选择那些(如果有的话)“foo”和“bar”以正确的顺序彼此相邻的文件。
无论如何,下载到客户端的数据量将远远少于下载和扫描所有内容,尽管这也取决于您的文件的结构以及您的搜索模式是什么样的。