2014-06-10 4 views
5

Ich versuche, einige JSON Twitter-Daten in eine Liste zu laden, aber stattdessen bekomme ich segmemtation fault (core dumped).Python Segmentierung Fehler bei der Verwendung von json.loads - alternative Möglichkeit, JSON in eine Liste zu laden?

Während ich würde gerne mein Speicher zu aktualisieren, ist das einfach keine Option im Moment. Ich würde gerne wissen, ob es einen Weg gibt, vielleicht über diese Liste zu iterieren anstatt zu versuchen, alles in den Speicher zu laden. Oder gibt es eine andere Art von Lösung für dieses Problem, die es mir erlaubt, diese JSON-Daten in eine Liste zu laden?

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) 

Die Daten wurden mit Hilfe der Twitter Streaming API über 10 Tage gesammelt und sind 213M groß.

Maschine Specs:

  • Oracle VM Virtual Box
  • Betriebssystem: Ubuntu (64 bit)
  • Basisspeicher: 1024 MB
  • Grafikspeicher: 128 MB
  • Speicher (Virtual Größe): 8,00 GB Dynamisch zugewiesen

Ich verwende iPyt hon (Version 2.7.6) und den Zugriff über ein Linux-Terminal-Fenster.

+3

Es ist interessant, dass es statt nur andernfalls mit einer Ausnahme abstürzt. Können Sie diese Datei irgendwo veröffentlichen? Ich würde es wirklich gerne sehen. – viraptor

+2

213MB ist ** winzig **. Kannst du das irgendwo zur Kenntnis nehmen? – Veedrac

+0

Was sind die Spezifikationen für die Maschine, die Sie verwenden, um dies zu versuchen? – ely

Antwort

1

Auf fast jeder modernen Maschine ist eine Datei mit 213 MB sehr klein und passt problemlos in den Speicher. Ich habe größere Tweet-Datensätze in den Speicher moderner moderner Maschinen geladen. Aber vielleicht arbeiten Sie (oder jemand anders, der das später liest) nicht an einer modernen Maschine, oder es ist eine moderne Maschine mit einer besonders kleinen Speicherkapazität.

Wenn es tatsächlich die Größe der Daten ist, die den Segmentierungsfehler verursachen, können Sie das Modul ijson zum Iterieren über Teile des JSON-Dokuments ausprobieren.

Hier ist ein Beispiel von dieser Seite des Projektes:

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>') 
Verwandte Themen