2012-04-30 52 views
53

thể trùng lặp:
Is there a memory efficient and fast way to load big json files in python?Đọc file json khá lớn trong Python

Vì vậy, tôi có một số json mã hóa file khá lớn. Nhỏ nhất là 300MB, nhưng đây là nhỏ nhất. Phần còn lại là nhiều GB, bất cứ nơi nào từ khoảng 2GB đến 10GB +.

Vì vậy, tôi dường như hết bộ nhớ khi cố tải tệp bằng Python. Tôi hiện đang chỉ chạy một số thử nghiệm để xem khoảng thời gian giao dịch với công cụ này sẽ mất để xem nơi để đi từ đây. Đây là mã tôi đang sử dụng để kiểm tra:

from datetime import datetime 
import json 

print datetime.now() 

f = open('file.json', 'r') 
json.load(f) 
f.close() 

print datetime.now() 

Không quá ngạc nhiên, Python cho tôi một lỗi MemoryError. Có vẻ như json.load() gọi json.loads (f.read()), mà đang cố gắng đổ toàn bộ tập tin vào bộ nhớ trước, điều này rõ ràng sẽ không hoạt động.

Bất kỳ cách nào tôi có thể giải quyết vấn đề này một cách rõ ràng?

Tôi biết điều này là cũ, nhưng tôi không nghĩ rằng đây là bản sao. Trong khi câu trả lời là như nhau, câu hỏi là khác nhau. Trong "trùng lặp", câu hỏi là làm thế nào để đọc các tệp lớn một cách hiệu quả, trong khi câu hỏi này đề cập đến các tệp thậm chí không phù hợp với bộ nhớ. Hiệu quả là không cần thiết.

+0

Tương tự nếu không phải cùng một câu hỏi: http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in- python – tskuzzy

+0

Vấn đề là nếu tệp JSON là một danh sách khổng lồ (ví dụ), thì phân tích cú pháp nó thành Python sẽ không có ý nghĩa gì nhiều nếu không làm tất cả cùng một lúc. Tôi đoán đặt cược tốt nhất của bạn là tìm một mô-đun xử lý JSON như SAX và cung cấp cho bạn các sự kiện để bắt đầu mảng và nội dung, thay vì cung cấp cho bạn các đối tượng. Thật không may, điều đó không tồn tại trong thư viện chuẩn. –

+0

Vâng, tôi muốn đọc nó trong cùng một lúc. Một trong những kế hoạch tiềm năng của tôi là đi qua nó một lần và dán mọi thứ vào một cơ sở dữ liệu để tôi có thể truy cập nó hiệu quả hơn. –

Trả lời

50

Tùy chọn tốt nhất dường như đang sử dụng thứ gì đó như ijson - một mô-đun sẽ hoạt động với JSON dưới dạng luồng chứ không phải dưới dạng tệp khối.

Chỉnh sửa: Cũng đáng xem - kashif's comment về .

+0

Cảm ơn! Tôi sẽ kiểm tra với hy vọng rằng tôi không phải sử dụng Java. –

+0

Vâng tôi nghĩ rằng tôi sẽ kết thúc bằng cách sử dụng Java nhưng đây là câu trả lời cho câu hỏi tôi thực sự yêu cầu. Cảm ơn một lần nữa. –

+4

Tôi thấy rằng ijson yêu cầu json hoàn chỉnh trước khi nó phát trực tuyến - tôi có thể đã thích thứ gì đó có thể hoạt động với phần json khi nó có sẵn. Không thể tìm thấy bất cứ điều gì để viết của riêng tôi, nó được gọi là [jsonstreamer] (https://github.com/kashifrazzaqui/json-streamer) và có sẵn tại [github] (https://github.com/kashifrazzaqui/json- streamer) và tại cheeseshop – kashif