2010-10-07 9 views
1

je télécharge beaucoup de magasin html dans os, maintenant obtenir leur contenu, et extraire des données ce dont j'ai besoin pour persister à mysql, j'utilise le fichier de chargement traditionnel un par un, ce n'est pas Coût efficace Nealy 8 mins.comment rapide lire 25k petit fichier txt contenu avec python

tous les conseils sont les bienvenus

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!" 

j'ai essayé mmap, il semble ne pas fonctionner bien

+0

@mlzboy: Le code et les données de profilage aideraient. – pyfunc

+0

Votre indentation est en peluche. –

+0

Quelle est la taille du 'petit fichier texte' moyen et le plus grand? – spenthil

Répondre

2

Si vous avez 25.000 fichiers texte sur le disque, 'vous le faites mal. Selon la façon dont vous les stockez sur le disque, la lenteur pourrait littéralement chercher sur le disque pour trouver les fichiers.

Si vous avez 25,0000 de n'importe quoi ce sera plus rapide si vous le mettez dans une base de données avec un index intelligent - même si vous faites du champ d'index le nom du fichier, il sera plus rapide.

Si vous avez plusieurs répertoires qui descendent N niveaux, une base de données serait toujours plus rapide.

+0

Je stocke les fichiers sur un seul répertoire – mlzboy

+1

25k fichiers dans un répertoire prendront beaucoup de temps à la liste, peu importe comment vous le découpez. Pour vous donner un exemple, j'ai écrit un script qui a généré des fichiers N avec entre 0 et 65 kilo-octets de données. Exécuter simplement 'ls -l' a pris 0.021 secondes @ 1000 fichiers, 0.199s pour 10.000 fichiers, et un énorme 0,487 secondes (une demi-seconde!) Pour 25 000 fichiers. C'est le pire des cas bien sûr, mais choisir des fichiers au hasard dans cette liste signifie toujours devoir traverser le btree et rivaliser avec d'autres applications qui utilisent le système de fichiers pour les lectures et les écritures. – synthesizerpatel

+0

Oups. Je comprends votre problème un peu mieux maintenant. Tout ce qui produit ces fichiers devrait écrire directement dans une base de données plutôt que d'utiliser un fichier intermédiaire avant que vous l'écrivez dans la base de données. Si vous êtes en train d'analyser HTML, pensez à écrire votre code spider en Python pour qu'il puisse tout faire en même temps. Vous pouvez également utiliser un système de répertoires à plusieurs niveaux pour répartir les blocs de fichiers en parties plus gérables. c'est-à-dire root/a/aa/aardvark.html, racine/c/ch/chiapet.html .. – synthesizerpatel

0

Vous pouvez analyser les fichiers en les téléchargeant dans plusieurs threads si vous utilisez scrapy.

+0

je garde tout le pas séparé, il gardera la solution claire – mlzboy

0

Si l'algorithme est correct, utiliser le module psyco peut parfois aider beaucoup. Il ne fonctionne cependant pas avec Python 2.7 ou Python 3+

Questions connexes