2016-09-27 1 views
-1

J'ai le code Python suivant où je recueille des données de l'entrée standard dans une liste et y exécute le syntaxnet. Les données sont sous la forme d'objets json à partir desquels je vais extraire le champ de texte et le nourrir vers syntaxnet.Recueillir des données en morceaux à partir de stdin: Python

data = [] 
for line in sys.stdin: 
    data.append(line) 
run_syntaxnet(data) ##This is a function## 

Je fais cela parce que je ne veux pas Syntaxnet à courir pour chaque tweet unique car il faudra un temps très long et donc diminuer les performances.

En outre, lorsque je cours ce code sur de très grandes données, je ne veux pas continuer à le collecter pour toujours et manquer de mémoire. Donc, je veux recueillir des données en morceaux - peut-être comme 10000 tweets à la fois et exécuter Syntaxnet sur eux. Quelqu'un peut-il m'aider à faire cela?

Aussi, je veux comprendre ce qui peut être la longueur maximale de la liste data afin que je ne manque pas de mémoire.

EDIT:

J'ai utilisé le code:

data = [] 
for line in sys.stdin: 
    data.append(line) 
    if len(data) == 10000: 
     run_syntaxnet(data) ##This is a function## 
     data = [] 

qui fonctionne parfaitement bien si le nombre de lignes dans les données d'entrée est un multiple de 10000. Je ne sais pas quoi faire avec le reste des rangées. Par exemple, si le nombre total de lignes est de 12 000, les premières 10000 lignes sont traitées comme je le souhaite, mais les 2000 suivantes sont interrompues car la condition len(data) > 10000 n'est pas remplie.

Je veux faire quelque chose comme:

if len(data) > 10000 or 'EOF of input file is reached': 
    run_syntaxnet(data) 

Quelqu'un peut-il me dire comment vérifier l'EOF du fichier d'entrée? Merci d'avance! PS: Toutes les données dans le fichier python proviennent de Streaming de porcs. En outre, je ne peux pas me permettre de compter le nombre de lignes sin les données d'entrée et envoyer en tant que paramètre car j'ai des millions de lignes et compter lui-même prendra une éternité.

+0

Jetez un oeil à des générateurs – iScrE4m

Répondre

0

Je pense que cela est tout ce que vous avez besoin:

data = [] 
for line in sys.stdin: 
    data.append(line) 
    if len(data) == 10000: 
     run_syntaxnet(data) ##This is a function## 
     data = [] 

une fois la liste arriver à 10000, puis exécutez la fonction et réinitialiser votre liste de données. En outre, la taille maximale de la liste variera d'une machine à l'autre, en fonction de la quantité de mémoire dont vous disposez. Il est donc préférable de l'essayer avec des longueurs différentes et de déterminer ce qui est optimal.

+0

Grand, merci !. J'ai essayé avec 10000 et cela a fonctionné, essayera un plus grand nombre. – kskp

0

Je recueillir les données en morceaux et de traiter ces morceaux quand ils « grands »:

LARGE_DATA = 10 

data = [] 
for line in sys.stdin: 
    data.append(line) 
    if len(data) > LARGE_DATA: 
     run_syntaxnet(data) 
     data = [] 
run_syntaxnet(data) 
+0

Je vois ce que vous dites. Avoir des paramètres configurables est toujours bon, c'est ce que ppl m'a toujours dit. Merci! – kskp