我目前正在尝试从超过800,000个网址下载文件。每个网址都代表.txt文件。
我使用dataframe存储所有
网址信息:
index Filename
4 .../data/1000015/0001104659-05-006777.txt
5 .../data/1000015/0000950123-05-003812.txt
......
代码:
for i in m.index:
download = 'ftp:/.../' + m['Filename'][i]
print download
urllib.urlretrieve(download, '%s''%s.txt' % (m['Co_name'][i], m['Date'][i]))
此方法有效,但速度非常低,它在7分钟内下载了15个文件。考虑到我有超过800,000个文件。这是超过9个月......所以我想知道有人可以帮我改进吗?非常感谢你。
经过一些非常有用的评论,我做了一些修改,以下是进行多处理的好方法吗?
代码:
def download(file):
import ftplib
ftp = ftplib.FTP('XXXX')
ftp.login()
for i in m.index:
a = m['Filename'][i]
local_file = os.path.join("local_folder", '%s %s.txt' % (m['Co_name'][i], m['Data'][i]))
fhandle = open(local_file,'wb')
print fhandle
ftp.retrbinary('RETR '+a, fhandle.write)
fhandle.close()
m=pd.read_csv('XXXX.csv', delimiter=',', index_col='index')
pool = Pool(10)
pool.map(download, m)
答案 0 :(得分:1)
这样,您可以为每个文件建立新连接。这意味着每下载任何内容的文件都会丢失几秒钟。
您可以使用ftplib(https://docs.python.org/2/library/ftplib.html)来减少这种情况,它允许建立单个连接并通过此连接逐个检索一个文件。
但是,有时间没有数据传输。要使用最大带宽,请使用线程并行下载多个文件。但请注意,某些服务器会限制并行连接的数量。
然而,时间开销不应超过几秒,在最坏的情况下可以说是5。然后,对于100kB文件大约25秒非常慢。 我猜你的连接很慢,或服务器是。如果FTP不是标准方式,可能是主机的FTP服务器在连接终止时关闭并在建立连接时启动?然后,FTPlib应该有所帮助。 然而,半秒的开销意味着400,000秒的等待。因此,并行下载是有道理的。
可能是,你首先尝试像filezilla这样的FTP客户端,并检查它可能带有什么带宽。