2014-06-10 12 views
5

Tôi đang cố gắng tải một số dữ liệu JSON JSON vào danh sách, nhưng thay vào đó tôi nhận được segmemtation fault (core dumped).Phân đoạn Python Lỗi khi sử dụng json.loads - cách khác để tải JSON vào danh sách?

Trong khi tôi muốn nâng cấp bộ nhớ của mình, điều đó đơn giản không phải là một tùy chọn ngay bây giờ. Tôi muốn biết nếu có một số cách để có thể lặp qua danh sách này thay vì cố gắng để tải tất cả vào bộ nhớ? Hoặc có thể có một loại giải pháp khác cho vấn đề này sẽ cho phép tôi tải dữ liệu JSON này vào một danh sách?

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) 

Dữ liệu được thu thập bằng API phát trực tuyến Twitter trong khoảng 10 ngày và có kích thước 213M.

Máy Specs:

  • Oracle VM Virtual Box
  • Hệ điều hành: Ubuntu (64 bit)
  • cơ sở Memory: 1024 MB
  • Video Memory: 128 MB
  • Storage (ảo Kích thước): 8.00 GB Được phân bổ động

Tôi đang sử dụng iPyt hon (phiên bản 2.7.6) và truy cập nó thông qua cửa sổ thiết bị đầu cuối Linux.

+3

Thật thú vị khi nó bị treo thay vì chỉ thất bại với một ngoại lệ. Bạn có thể cung cấp tệp đó ở nơi nào đó công khai không? Tôi thực sự muốn nhìn vào nó. – viraptor

+2

213MB là ** nhỏ **. Bạn có thể lưu trữ một nơi nào đó để xem xét không? – Veedrac

+0

Thông số kỹ thuật cho máy bạn đang sử dụng để dùng thử là gì? – ely

Trả lời

1

Trên hầu hết mọi máy hiện đại, tệp 213MB rất nhỏ và dễ dàng phù hợp với bộ nhớ. Tôi đã tải các bộ dữ liệu tweet lớn hơn vào bộ nhớ trên các máy hiện đại trung bình. Nhưng có lẽ bạn (hoặc người khác đọc điều này sau) không hoạt động trên một cỗ máy hiện đại, hoặc nó là một cỗ máy hiện đại với dung lượng bộ nhớ đặc biệt nhỏ.

Nếu nó thực sự là kích thước của dữ liệu gây ra lỗi phân đoạn, thì bạn có thể thử mô-đun ijson để lặp qua các phần của tài liệu JSON.

Dưới đây là một ví dụ từ trang của dự án:

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>') 
Các vấn đề liên quan