Question

Je suis en train de trouver la meilleure façon d'ajouter des données à un fichier JSON en utilisant Python. Fondamentalement, ce qui se passe est que je l'ai dit au sujet de 100 threads données ouvertes de mémorisation à un tableau. Quand ils ont fini, ils l'envoient à un fichier JSON en utilisant json.dump. Cependant, puisque cela peut prendre quelques heures pour le tableau de construire je finis à court de RAM par la suite. Donc, je suis en train de voir quelle est la meilleure façon d'utiliser le moins de RAM dans ce processus. Ce qui suit est ce que j'ai qui consomme à beaucoup de RAM.

        i               = 0
        twitter_data    = {}
        for null in range(0,1):
            while True:
                try:
                    for friends in Cursor(api.followers_ids,screen_name=self.ip).items():
                        twitter_data[i]                     = {}
                        twitter_data[i]['fu']               = self.ip
                        twitter_data[i]['su']               = friends
                        i = i + 1
                except tweepy.TweepError, e:
                    print "ERROR on " + str(self.ip) + " Reason: ", e
                    with open('C:/Twitter/errors.txt', mode='a') as a_file:
                        new_ii = "ERROR on " + str(self.ip) + " Reason: " + str(e) + "\n"
                        a_file.write(new_ii)
                break

        ## Save data

        with open('C:/Twitter/user_' + str(self.id) + '.json', mode='w') as f:
                json.dump(twitter_data, f, indent=2, encoding='utf-8')

Merci

Était-ce utile?

La solution

Mon point de vue, la construction sur l'idée de la réponse de Glenn, mais sérialisation un grand dict tel que demandé par l'OP et en utilisant plus pythonique enumerate au lieu de incrémenter manuellement i (erreurs peuvent être prises en compte en gardant un compte séparé pour eux et en soustrayant il de i avant wriring à f):

with open('C:/Twitter/user_' + str(self.id) + '.json', mode='w') as f:
   f.write('{')
   for i, friends in enumerate(Cursor(api.followers_ids,screen_name=self.ip).items()):
        if i>0:
            f.write(", ")
        f.write("%s:%s" % (json.dumps(i), json.dumps(dict(fu=self.ip, su=friends))))
   f.write("}")

Autres conseils

Sortie Les éléments individuels comme un tableau comme ils sont créés, créant ainsi le JSON mise en forme pour le tableau autour manuellement. JSON est un format simple, si cela est trivial de le faire.

Voici un exemple simple qui imprime un tableau JSON, sans avoir à tenir tout le contenu dans la mémoire; seulement un seul élément dans la matrice doit être stockée à la fois.

def get_item():
    return { "a": 5, "b": 10 }

def get_array():
    results = []
    yield "["
    for x in xrange(5):
        if x > 0:
            yield ","
        yield json.dumps(get_item())
    yield "]"

if __name__ == "__main__":
    for s in get_array():
        sys.stdout.write(s)
    sys.stdout.write("\n")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top