Pergunta

Estou tentando encontrar a maneira ideal de anexar alguns dados a um arquivo JSON usando o Python. Basicamente, o que acontece é que eu tenho sobre dizer 100 threads abertos de armazenamento de dados para uma matriz. Quando terminar, eles enviam isso para um arquivo json usando json.dump. No entanto, como isso pode levar algumas horas para que a matriz acumule, acabo ficando sem RAM eventualmente. Então, estou tentando ver qual é a melhor maneira de usar a menor quantidade de RAM nesse processo. A seguir, é o que tenho que consome muita 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')

Obrigado

Foi útil?

Solução

Minha opinião, construindo a idéia da resposta de Glenn, mas serializando um grande ditado conforme solicitado pelo OP e usando o mais pitônico enumerate em vez de incrementar manualmente i (Os erros podem ser levados em consideração, mantendo uma contagem separada para eles e subtraindo -a de i Antes de se divertir 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("}")

Outras dicas

Saia os itens individuais como uma matriz como são criados, criando a formatação JSON para a matriz ao redor manualmente. JSON é um formato simples, então isso é trivial.

Aqui está um exemplo simples que imprime uma matriz JSON, sem ter que manter todo o conteúdo na memória; Apenas um único elemento na matriz precisa ser armazenado de uma só vez.

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")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top