2010-10-07 95 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+