2016-06-07 34 views
0

我當前正在使用python 3.4,並且在運行我的代碼時出現錯誤10055。代碼如下。錯誤10055:填充數據庫時'沒有可用的緩衝區'

我試着把一個「time.sleep(10)」,它允許我的數據庫收集更多的條目,但最終我的程序總是得到錯誤。

我明白,當我「sock.close()」我的套接字,套接字並沒有真正關閉,它會在關閉之前持續一段時間,那是什麼導致我的錯誤。

我無法找到強制連接關閉的方法,以釋放套接字並運行程序完成。

我在我的代碼中有很多方法,但是這些都會與我的錯誤相關,如果你想要整個代碼,只是讓我知道。

from urllib.request import urlopen 
import xml.etree.ElementTree as ET 
import time 

# Connect to MongoDB 
def database_connection(): 
    from pymongo import MongoClient 
    MONGODB_HOST = 'localhost' 
    MONGODB_PORT = 27017 
    DBS_NAME = 'SEC' 
    COLLECTION_NAME = 'Form15F' 
    connection = MongoClient(MONGODB_HOST, MONGODB_PORT) 
    collection = connection[DBS_NAME][COLLECTION_NAME] 
    return collection, connection 

# Connection to the .XML online link 
def connection(xml_link): 
    import socket 
    # Make xml_link readable so it can be manipulated 
    sock = urlopen(xml_link) 
    xml_readable = sock.read() 
    sock.close() 
    root = ET.fromstring(xml_readable) 
    return root 

# Populate database 
def database_addition(Holdings_FundName, Holdings_Name, Holdings_Shares, Holdings_Value, Holdings_Date): 
    for i in range(len(Holdings_Name)): 
     dictionary = {'Date':Holdings_Date[i] ,'Fund Name':Holdings_FundName[i],'Holding Company':Holdings_Name[i], 'Number of Shares':Holdings_Shares[i], 'Value of Shares':Holdings_Value[i]} 
     db, dbc = database_connection() 
     db.insert(dictionary) 
     dbc.close() 

def main(link): 
    all_xml_docs = fund_listings(link) 
    for i in all_xml_docs: 
     Fund_Name, date, xml_link = fund_details(i) 
     print(Fund_Name) 
     print(xml_link) 
     Holdings_FundName, Holdings_Name, Holdings_Shares, Holdings_Value, Holdings_Date = holdings_attributes(xml_link, Fund_Name, date) 
     database = database_addition(Holdings_FundName, Holdings_Name, Holdings_Shares, Holdings_Value, Holdings_Date) 
     time.sleep(10) 
+0

我看到一些功能,但它們並不怎麼叫。 –

回答

0

問題出在我連接和斷開MongoDB的次數之內。我改變了database_addition函數,並刪除了這個問題。 我已經發布了這兩種方式的功能可以改變,以消除這個問題。第一個是改變在for循環之前和之外連接數據庫的位置。第二種是使用bulk_insert來填充數據庫。

# Populate database 
def database_addition(Holdings_FundName, Holdings_Name, Holdings_Shares, Holdings_Value, Holdings_Date): 
    db, dbc = database_connection() 
    for i in range(len(Holdings_Name)): 
     dictionary = {'Date':Holdings_Date[i] ,'Fund Name':Holdings_FundName[i],'Holding Company':Holdings_Name[i], 'Number of Shares':Holdings_Shares[i], 'Value of Shares':Holdings_Value[i]} 
     db, dbc = database_connection() 
     db.insert(dictionary) 
    dbc.close() 

insert_bulk:

# Bulk insert 
def database_addition_bulk(attribute_list): 
    db,dbc = database_connection() 
    db.insert_many([{'Date':attribute_list[0][i], 'Fund Id':attribute_list[1][i], 'Fund Name':attribute_list[2][i],'Holding CUSIP':attribute_list[3][i], 'Holding Name':attribute_list[4][i], 'Number of Shares':attribute_list[5][i], 'Value of Shares':attribute_list[6][i]} for i in range(len(attribute_list[0]))]) 
    dbc.close()