2009-06-26 149 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接口創建下載任務的經驗。

當然還有其他可用界面程序存在。

問候!