2010-10-07 96 views
1

我下載許多HTML存儲在操作系統,現在得到他們的內容,並提取數據我需要持久化到MySQL, 我使用傳統的加載文件一個接一個,它不是效率成本nealy 8分鐘。如何快速閱讀與python 25K小txt文件內容

任何意見,歡迎

g_fields=[ 
'name', 
'price', 
'productid', 
'site', 
'link', 
'smallImage', 
'bigImage', 
'description', 
'createdOn', 
'modifiedOn', 
'size', 
'weight', 
'wrap', 
'material', 
'packagingCount', 
'stock', 
'location', 
'popularity', 
'inStock', 
'categories', 
] @cost_time 
def batch_xml2csv(): 
    "批量將xml導入到一個csv文件中" 
    delete(g_xml2csv_file) 
    f=open(g_xml2csv_file,"a") 
    import os.path 
    import mmap 
    for file in glob.glob(g_filter): 
    print "讀入%s"%file 
    ff=open(file,"r+") 
    size=os.path.getsize(file) 
    data=mmap.mmap(ff.fileno(),size) 
    s=pq(data.read(size)) 
    data.close() 
    ff.close() 
    #s=pq(open(file,"r").read()) 
    line=[] 
    for field in g_fields: 
     r=s("field[@name='%s']"%field).text() 
     if r is None: 
      line.append("\N") 
     else: 
      line.append('"%s"'%r.replace('"','\"')) 
    f.write(",".join(line)+"\n") 
    f.close() 
    print "done!" 

我嘗試的mmap,它似乎沒有工作

+0

@mlzboy:代碼和分析數據將有所幫助。 – pyfunc 2010-10-07 05:27:34

+0

您的縮進填滿了。 – 2010-10-07 07:07:56

+0

平均和最大的'小文本文件'的大小是多少? – spenthil 2010-10-07 07:31:54

回答

2

如果你有在磁盤上的25000個的文本文件,「你這樣做是錯誤的」。根據你將它們存儲在磁盤上的方式,緩慢可能會在磁盤上尋找文件。

如果你有25,0000的任何東西它會更快,如果你把它放在一個智能索引的數據庫 - 即使你索引字段的文件名會更快。

如果您有多個下降N級深度的目錄,數據庫仍然會更快。

+0

我將文件存儲在單個目錄中 – mlzboy 2010-10-07 06:24:50

+1

無論您如何分片,25k個文件在一個目錄中都需要很長時間才能列出。舉一個例子,我寫了一個腳本,它生成了0到65千字節數據的N個文件。簡單地運行'ls -l'需要0.021秒@ 1000個文件,10,000個文件需要0.199秒,25,000個文件需要0.487秒(半秒!)。這當然是最糟糕的情況,但隨機從這個列表中挑選文件仍然意味着必須遍歷btree _並且與其他正在使用文件系統進行讀寫的應用程序競爭。 – synthesizerpatel 2010-10-07 11:37:43

+0

哎呀。我現在明白你的問題好一點了。無論是生成這些文件,而是直接寫入數據庫,而不是使用中間文件_before_將其寫入數據庫。如果你通過HTML解析,可以考慮在Python中編寫你的蜘蛛代碼,以便它可以一次完成所有事情。或者,使用分層目錄系統,以便將文件塊分解爲更易於管理的部分。即root/a/aa/aardvark.html,root/c/ch/chiapet.html .. – synthesizerpatel 2010-10-07 11:43:29

0

如果您使用scrapy,則可以在多個線程中下載文件的同時掃描這些文件。

+0

我將所有步驟分開,它將保持解決方案清晰 – mlzboy 2010-10-07 08:44:37

0

如果算法正確,使用psyco模塊有時可以幫助很多。但它不適用於Python 2.7或Python 3+