Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用boto和multiprocessing.Pool从S3下载文件时性能不可靠_Python_Amazon S3_Multiprocessing_Boto - Fatal编程技术网

Python 使用boto和multiprocessing.Pool从S3下载文件时性能不可靠

Python 使用boto和multiprocessing.Pool从S3下载文件时性能不可靠,python,amazon-s3,multiprocessing,boto,Python,Amazon S3,Multiprocessing,Boto,我想从S3下载数千个文件。为了加快进程,我试用了Python,但我发现性能非常不可靠。有时它可以工作,并且比单核版本快得多,但通常一些文件需要几秒钟,因此多进程运行比单进程运行需要更长的时间。有几次我甚至收到一个ssl.SSLError:read操作超时了 原因可能是什么 from time import time from boto.s3.connection import S3Connection from boto.s3.key import Key from multiprocessin

我想从S3下载数千个文件。为了加快进程,我试用了Python,但我发现性能非常不可靠。有时它可以工作,并且比单核版本快得多,但通常一些文件需要几秒钟,因此多进程运行比单进程运行需要更长的时间。有几次我甚至收到一个
ssl.SSLError:read操作超时了

原因可能是什么

from time import time
from boto.s3.connection import S3Connection
from boto.s3.key import Key
from multiprocessing import Pool
import pickle

access_key=xxx
secret_key=xxx
bucket_name=xxx

path_list = pickle.load(open('filelist.pickle','r'))
conn = S3Connection(access_key, secret_key)
bucket = conn.get_bucket(bucket_name)
pool = Pool(32)


def read_file_from_s3(path):
    starttime = time()
    k = Key(bucket)
    k.key = path
    content = k.get_contents_as_string()
    print int((time()-starttime)*1000)
    return content


results = pool.map(read_file_from_s3, path_list) 
# or results = map(read_file_from_s3, path_list) for a single process comparison
pool.close()
pool.join()
[Update]我最后只在我的多处理代码中添加了带有重试的超时(
imap
+
.next(timeout)
),但这只是因为我当时不想更改太多。如果你想把它做好,使用Jan Philip的appraoch和gevent

“这是什么原因?”

不够详细。一个原因可能是您的私有Internet连接因太多并发连接而不足。但由于您没有指定在哪个环境中执行这段代码,这纯粹是推测

然而,不可猜测的是,你解决这个问题的方法非常低效<代码>多处理用于解决CPU受限的问题。一次通过多个TCP连接检索数据不是CPU限制的问题。每个TCP连接生成一个进程是对资源的浪费

这似乎很慢的原因是,在您的情况下,一个进程花费大量时间等待系统调用返回(另一方面,操作系统花费大量时间等待网络模块执行命令)(网络组件花费大量时间等待数据包通过线路到达)

您不需要多个进程来减少计算机的等待时间。您甚至不需要多个线程。您可以使用协作调度从单个操作系统级线程内的多个TCP连接中提取数据。在Python中,这通常是使用greenlet完成的。使用greenlet的更高级别模块是

web上充满了基于gevent的实例,可以同时触发许多HTTP请求--。给定一个正确的Internet连接,一个操作系统级线程可以同时处理数百个、数千个或上万个并发连接。在这些数量级中,问题会演变为I/O限制或CPU限制取决于应用程序的确切用途。也就是说,网络连接、CPU内存总线或单个CPU内核都会限制应用程序


关于
ssl.SSLError:read操作超时
-类似错误:在网络世界中,您必须考虑不时发生的此类事件并做出决定(取决于应用程序的详细信息)您希望如何处理这些情况。通常,简单的重试尝试是一个很好的解决方案。

我不同意您的说法,“通过多个TCP连接一次检索数据不是CPU限制的问题。”如果要传输的文件是大的和多的。您不认为每个文件的吞吐量是有限的。传输文件并行可以利用AWS S3中的总IO吞吐量。“……”对于每个文件的吞吐量是有限的。[…]并行可以利用总IO吞吐量[…]您自己说这通常是一个I/O限制的问题。在专业环境中,即使NIC容量被充分利用,CPU也几乎没有加载。数据可以以10 Gbps的速度传输,CPU负载可以低于5%。这是因为现代NIC为您完成所有工作。您通常不需要大量的CPU电源对于高速流式传输数据。抱歉,没有明确说明。我的意思是与服务器端相关,而不是与客户端相关。AWS文档说的是,“提高吞吐量您可以并行上载部分以提高吞吐量。”一些S3客户端,例如S3浏览器,也提供了多部分下载功能。我认为并发对于一些S3使用场景是很好的。