Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

[Python2.7/Générateur/wsgi/Performance]: retourner un fichiers csv contient plus 100 000 lines.

+4 votes

Je voudrai améliorer les performances de mon code, et je voudrai savoir s'il y a un moyen de retourner un fichier csv contient plus 100, 000 lignes sans que apache sorte en timeout, et sans modifier le timeout.

mon code par exemple

.....
import cStringIO
...
io = cStringIO.StringIO()
csv.register_dialect( 'my_excel', delimiter=';', quoting=csv.QUOTE_MINIMAL, quotechar='"' )
writer = csv.writer( io, dialect='my_excel' )
lines = []
for csv_line in my_generator:
    lines.append( csv_line )

writer.writerows( lines )
...
data = io.getvalue()
...
res.body_file.write( data )
demandé 23-Fev-2016 par akadi (324 points)
edité 23-Fev-2016 par akadi

Et la pagination, c'est acceptable ? ça résoudrait le prob.

1 Réponse

+2 votes
 
Meilleure réponse

Je dirais que tu devrais sauter les étapes intermédiaires:

for csv_line in my_generator:
    line = '"%s" % ";"'.join(csv_line)
    res.body_file.write(line)
répondu 24-Fev-2016 par Sam (4,984 points)
sélectionné 8-Avr-2016 par akadi

ce serait intéressant que akadi teste puis nous fasse un retour avec les temps d'exécution, les gains/pertes de performances

c'est en cours :)

Je pense que ça va marcher.

Le timeout est probablement dû au fait que les étapes préparatoires prennent trop de temps, mais si on commence à renvoyer le résultat immédiatement, ça devrait aller.

Après, il faut dire que le HTTP n'est pas prévu pour ce genre de chose.

Excusez-moi pour ce commentaire tardif (vacances :p )

En fait le fait d'écrire dans res.bodyfile c'est bien mais le mieux c'est le faire un yield directement au lieu de passer par le res.bodyfile:

for csv_line in my_generator:
    yield "{}\n".format( ";".join( line ) )

ça marche super bien.
Testé avec un fichier contient plus de 300 000 lignes.

Merci.

...