2009-06-26 203 views
2

什么是从Python中获取大量来自Amazon S3的大量文件(相对较小的10-50kB)的最快方法? (大约200万 - 百万个文件)。从S3下载大量文件

目前我正在使用boto生成签名的URL,并使用PyCURL逐个获取文件。

某种类型的并发会有帮助吗? PyCurl.CurlMulti对象?

我接受所有建议。谢谢!

回答

1

在python的情况下,由于这是IO绑定,所以多个线程将使用CPU,但它可能只会使用一个核心。如果您有多个内核,则可能需要考虑新的multiprocessor模块。即使那样你也许希望每个进程都使用多个线程。你将不得不对一些处理器和线程进行调整。

如果你确实使用多个线程,这是Queue类的一个好选择。

+0

在这种情况下multiprocessor.Pool对象会起作用吗?我并不完全清楚用于多处理的API。 Pool对象的确切功能是什么? 我在想,我们不能简单地产生数以万计的进程,所以我们可以保留一个池,当一个下载完成时,可以通过池定义中定义的最大进程数添加到另一个池中,如'p = Pool(N) 这种方法是否正确? – Sohaib 2014-08-24 02:57:30

2

我对python一无所知,但总的来说,你会想把任务分解成更小的块,以便它们可以同时运行。您可以按文件类型或按字母顺序将其分解,然后为分解的每个部分运行单独的脚本。

0

我一直在使用txaws与扭曲的S3工作,虽然你可能想要的只是获取经过身份验证的URL,并使用twisted.web.client.DownloadPage(默认情况下会很乐意从流到文件没有多次交互)。

Twisted使您可以轻松运行所需的任何并发。对于大约20万的东西,我可能会创建一个生成器并使用合作器来设置我的并发性,并让生成器生成每个必需的下载请求。

如果你不熟悉扭曲,你会发现模型需要一些时间来习惯,但它是值得的。在这种情况下,我希望它占用最少的CPU和内存开销,但是您不得不担心文件描述符。如果您发现自己需要更多的文件描述符,或者如果您有多个希望将其拉下来的连接,那么在透视代理中进行混合并将这些工作分配给多台计算机是相当容易的。

1

您可以考虑使用s3fs,只是运行并行文件系统从Python命令。

0

每个作业都可以通过适当的工具:)

你想使用Python进行压力测试S3 :)来完成,所以我建议找一个大体积的下载程序,并通过链接到它。

在Windows上,我有安装ReGet程序(共享软件,从http://reget.com)和通过COM接口创建下载任务的经验。

当然还有其他可用界面程序存在。

问候!