从Python获取Amazon S3的大量文件(相对较小的10-50kB)的最快方法是什么? (大约200,000万个文件)。
目前我正在使用boto生成签名URL,并使用PyCURL逐个获取文件。
某种类型的并发会有帮助吗? PyCurl.CurlMulti对象?
我对所有建议持开放态度。谢谢!
答案 0 :(得分:2)
我对python一无所知,但总的来说,你会希望将任务分解成更小的块,以便它们可以同时运行。您可以按文件类型或字母或其他方式对其进行细分,然后为细分的每个部分运行单独的脚本。
答案 1 :(得分:1)
在python的情况下,由于这是IO绑定,多个线程将使用CPU,但它可能只使用一个核心。如果您有多个核心,则可能需要考虑新的multiprocessor模块。即便如此,您可能希望每个进程都使用多个线程。你必须对处理器和线程的数量做一些调整。
如果你使用多个线程,这是Queue类的一个很好的候选者。
答案 2 :(得分:1)
您可以考虑使用s3fs,只需从Python运行并发文件系统命令。
答案 3 :(得分:0)
我一直在使用扭曲的txaws进行S3工作,虽然您可能想要的只是获取经过身份验证的URL并使用twisted.web.client.DownloadPage(默认情况下很乐意从流到文件没有太多交互)。
Twisted使您可以轻松运行所需的并发性。对于大约200,000的东西,我可能会创建一个生成器并使用合作者来设置我的并发性,让生成器生成所有必需的下载请求。
如果你不熟悉扭曲,你会发现这个模型需要一点时间来适应,但它是值得的哦。在这种情况下,我希望它占用最小的CPU和内存开销,但你不得不担心文件描述符。如果你发现自己需要更多的文件描述符,或者如果你有多个你希望它下拉的连接,那么在透视代理中混合并将工作分配到多台机器上非常容易。
答案 4 :(得分:0)
线程+队列怎么样,我喜欢这篇文章:Practical threaded programming with Python
答案 5 :(得分:0)
每项工作都可以使用适当的工具完成:)
你想使用python进行压力测试S3 :),所以我建议找一个大容量下载程序并传递给它的链接。
在Windows上我有安装ReGet程序(共享软件,来自http://reget.com)和通过COM接口创建下载任务的经验。
当然可能存在其他具有可用界面的程序。
问候!