2014-06-10 5 views
5

Sto provando a caricare alcuni dati JSON su Twitter in una lista, ma invece sto ricevendo segmemtation fault (core dumped).Errore di segmentazione Python quando si utilizza json.loads: un modo alternativo per caricare JSON in un elenco?

Mentre mi piacerebbe aggiornare la memoria, non è un'opzione al momento. Mi piacerebbe sapere se c'è qualche modo per iterare su questa lista invece di provare a caricare tutto in memoria? O forse c'è un diverso tipo di soluzione a questo problema che mi permetterà di caricare questi dati JSON in una lista?

In [1]: import json 

In [2]: data = [] 

In [3]: for i in open('tweets.json'): 
    ...:  try: 
    ...:   data.append(json.loads(i)) 
    ...:  except: 
    ...:   pass 
    ...:  

Segmentation fault (core dumped) 

I dati sono stati raccolti utilizzando l'API di Twitter streaming su circa 10 giorni ed è 213M in termini di dimensioni.

Spec macchina:

  • Oracle VM Virtual Box
  • Sistema operativo: Ubuntu (64 bit)
  • Base di memoria: 1024 MB
  • Memoria video: 128 MB
  • bagagli (virtuale Dimensioni): 8.00 GB assegnato dinamicamente

Sto usando iPyt hon (versione 2.7.6), e accedendo attraverso una finestra di terminale Linux.

+3

E 'interessante il fatto che si blocca invece di non aver con un'eccezione. Sei in grado di fornire quel file da qualche parte pubblico? Mi piacerebbe davvero guardarlo. – viraptor

+2

213 MB è ** minuscolo **. Puoi ospitarlo da qualche parte per esame? – Veedrac

+0

Quali sono le specifiche per la macchina che stai utilizzando per provare questo? – ely

risposta

1

In quasi tutte le macchine moderne, un file da 213 MB è molto piccolo e si adatta facilmente alla memoria. Ho caricato più dataset di tweet su memoria in media su macchine moderne. Ma forse tu (o qualcun altro che legge più tardi) non lavori su una macchina moderna, o è una macchina moderna con una capacità di memoria particolarmente piccola.

Se è effettivamente la dimensione dei dati che causa l'errore di segmentazione, è possibile provare il modulo ijson per l'iterazione su blocchi del documento JSON.

Ecco un esempio dalla pagina del progetto:

import ijson 

parser = ijson.parse(urlopen('http://.../')) 
stream.write('<geo>') 
for prefix, event, value in parser: 
    if (prefix, event) == ('earth', 'map_key'): 
     stream.write('<%s>' % value) 
     continent = value 
    elif prefix.endswith('.name'): 
     stream.write('<object name="%s"/>' % value) 
    elif (prefix, event) == ('earth.%s' % continent, 'end_map'): 
     stream.write('</%s>' % continent) 
stream.write('</geo>') 
Problemi correlati