1
這是一個從前面的問題中產生的問題(請參閱Downloading a LOT of files using Python),但比我最初提出的問題更具體,我認爲它應該得到它自己的題。Python中的多重處理<urlopen error ftp error>當下載文件的批處理文件時
當運行python multiprocessing,如果我嘗試使用線程一次下載一批文件,它只會引發一些文件上的錯誤。這是錯誤,顯然urllib2打開文件時出錯,但問題是,爲什麼?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 250, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
urllib2.URLError: <urlopen error ftp error: >
奇怪的是,如果我一次下載一個文件,我不會得到這個錯誤。錯誤是(通常)不一致。如果我運行相同的過程兩次,它會拋出相同的錯誤,但在不同的文件。這導致我認爲問題是線程的交互。也許2個線程試圖在同一時間ping網站?有誰知道可能是什麼原因造成的?
我正在使用的機器是運行32位內核的RedHat的LinuxBox。
這裏是我使用的代碼:
from __future__ import division
import pandas as pd
import numpy as np
import urllib2
import os
import linecache
from multiprocessing import Pool
import time
#making our list of urls to download from
data2=pd.read_csv("edgar14A14C.csv")
flist=np.array(data2['filename'])
print len(flist)
print flist
os.chdir(str(os.getcwd())+str('/edgar14A14C'))
###below we have a script to download all of the files in the data2 database
###here you will need to create a new directory named edgar14A14C in your CWD
def job(url):
print "I'm doing something!"
file_name = str(url.split('/')[-1])
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
f.write(u.read())
print file_name
f.close()
urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist]
pool = Pool(processes=20)
pool.map(job, urls)
這些也可以稱爲文件描述符。 – Nathaniel
我只是嘗試添加一個u.close()命令,我仍然得到相同的錯誤。這看起來好像我在做什麼內存錯誤?是否可能在讀取或寫入文件之前執行f.close()? – sfortney
它可能是另一端的東西,使您無法在如此短的時間內下載這麼多文件。您可以嘗試捕獲異常並記錄它以查看每次運行發生多少次。 – Nathaniel