2012-05-23 28 views
8

Tôi có tệp JSON 1.7 GB khi tôi cố mở bằng json.load() sau đó nó đưa ra lỗi bộ nhớ, Làm thế nào có thể đọc tệp json trong python?Mở một tệp JSON lớn trong Python

Tệp JSON của tôi là một mảng lớn các đối tượng chứa các khóa cụ thể.

EDIT: Vâng, nếu nó chỉ là một mảng lớn của các đối tượng và nó được biết đến cấu trúc của các đối tượng trước thì không cần phải sử dụng các công cụ chúng ta có thể đọc nó từng dòng. Một dòng sẽ chỉ chứa một phần tử của mảng. Tôi nhận thấy đó là cách các file json được lưu trữ, đối với tôi nó làm việc như chỉ

>>>for line in open('file.json','r').readline(): 
... do something with(line) 
+1

Tại sao bạn có tệp JSON khổng lồ như vậy? Một định dạng khá nhiều luôn đọc vào bộ nhớ như một tổng thể là khá nhiều không thích hợp cho các cấu trúc lớn như thế này. Cân nhắc lưu trữ dữ liệu của bạn trong cơ sở dữ liệu. – ThiefMaster

+0

Bạn đang cố gắng làm gì với dữ liệu? Nó đến từ đâu? –

+0

Tôi có lẽ nên lưu trữ chúng trong các tệp khác nhau nhưng không làm điều đó :(, tôi muốn sử dụng dữ liệu đó để phân tích tình cảm. –

Trả lời

10

Bạn muốn có một phân tích cú pháp JSON gia tăng như yajl và là một trong bindings python của nó. Trình phân tích cú pháp gia tăng đọc ít nhất có thể từ đầu vào và gọi một cuộc gọi lại khi có điều gì đó có ý nghĩa được giải mã. Ví dụ: để chỉ lấy các số từ một tệp json lớn:

class ContentHandler(YajlContentHandler): 
    def yajl_number(self, ctx, val): 
     list_of_numbers.append(float(val)) 

parser = YajlParser(ContentHandler()) 
parser.parse(some_file) 

Xem http://pykler.github.com/yajl-py/ để biết thêm thông tin.

+0

Tệp json của tôi là một mảng lớn các đối tượng không giúp tôi phân tích cú pháp? –

+1

@ HirakSarkar: vâng. Bạn sẽ cần phải xác định các callback thích hợp trong lớp ContentHandler của bạn. – georg

+0

Tôi đang gặp một vấn đề có dây sau khi cài đặt yajl bởi easy_install trong trình bao python, nó cho lỗi rằng module yajl không có ở đó. Tôi nên làm gì. Phiên bản python của tôi là 2.6 –

1

Tôi đã tìm thấy một trình bao bọc python khác xung quanh thư viện yajl, là ijson.

Nó hoạt động tốt hơn cho tôi hơn yajl-py vì các lý do sau đây:

  • yajl-py đã không phát hiện thư viện yajl trên hệ thống của tôi, tôi đã phải hack mã để làm cho nó hoạt
  • đang ijson là nhỏ gọn hơn và dễ dàng hơn để sử dụng
  • ijson thể làm việc với cả hai yajl v1 và v2 yajl, và nó thậm chí còn có trăn tinh khiết thay thế yajl
  • ijson có ObjectBuilder rất đẹp, giúp chiết xuất n ot chỉ sự kiện nhưng có ý nghĩa phụ đối tượng từ dòng phân tích cú pháp, và ở mức độ bạn chỉ định
0

tôi thấy yajl (do đó ijson) là chậm hơn nhiều so với mô-đun json khi một tập tin dữ liệu lớn được truy cập từ đĩa địa phương. Đây là một mô-đun mà tuyên bố để thực hiện tốt hơn so với yajl/ijson (vẫn chậm hơn so với json), khi được sử dụng với Cython:

http://pietrobattiston.it/jsaone

Như tác giả chỉ ra, hiệu suất có thể tốt hơn so với json khi tập tin là đã nhận được qua mạng vì một trình phân tích cú pháp gia tăng có thể bắt đầu phân tích cú pháp sớm hơn.

Các vấn đề liên quan