2014-06-25 83 views
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) 

回答

0

流程是僅限於具有文件指針在特定的時間開放的具體數量。 urllib2.urlopen(url)打開一個文件指針(套接字)。完成數據後,請務必關閉它:u.close()

+0

這些也可以稱爲文件描述符。 – Nathaniel

+0

我只是嘗試添加一個u.close()命令,我仍然得到相同的錯誤。這看起來好像我在做什麼內存錯誤?是否可能在讀取或寫入文件之前執行f.close()? – sfortney

+0

它可能是另一端的東西,使您無法在如此短的時間內下載這麼多文件。您可以嘗試捕獲異常並記錄它以查看每次運行發生多少次。 – Nathaniel