2015-05-25 14 views
5

Tôi đang gặp khó khăn khi phân tích cú pháp tệp json lớn.Cách tốt nhất để phân tích cú pháp tệp JSON khổng lồ trong ruby ​​

Tệp là> 1GB và tôi đã thử sử dụng hai loại đá quý: ruby-stream và yajl, cả hai đều không hoạt động.

Dưới đây là ví dụ về những gì sẽ xảy ra.

fileStr = File.read("hugeJSONfile.json") 

^Phần này là OK.

Nhưng khi tôi cố gắng tải tệpStr vào một băm JSON (thông qua ruby-stream hoặc yajl), máy tính của tôi bị đóng băng.

Bất kỳ ý tưởng nào khác về cách thực hiện điều này hiệu quả hơn? Cảm ơn bạn.

Trả lời

3

Hãy xem vào json-stream hay yajl:

quote chính từ các tài liệu:

json-stream:

tài liệu riêng của mình là không bao giờ đọc hoàn toàn vào bộ nhớ.

yajl:

Lợi ích chính của thư viện này là sử dụng bộ nhớ của nó. Vì nó có thể phân tích luồng theo các khối, yêu cầu bộ nhớ của nó rất, rất thấp.

Bạn đăng ký sự kiện bạn đang tìm kiếm và trả về khóa/giá trị trong khi đọc qua JSON thay vì tải tất cả vào cấu trúc dữ liệu ruby ​​(và do đó vào bộ nhớ).

+1

Tôi không chắc chắn nếu bạn đọc toàn bộ bài đăng của tôi, nhưng cả hai đá quý đó đều đóng băng máy tính của tôi. – hackstar15

+0

Linh cảm của tôi là tệp JSON của tôi quá phức tạp đối với những viên đá quý đó. Ví dụ: nếu tôi có một cái gì đó như [{... [... {...}]}] trong đó mỗi "..." là siêu dài thì đá quý có thể phát trực tiếp cho đến khi cố gắng cân bằng khung combo, có thể mất một lúc. Xin lưu ý rằng tôi KHÔNG xem xét cách những viên đá quý này tối ưu hóa quy trình phát trực tuyến và đây là tất cả linh cảm. – hackstar15

+0

Bạn có đang xem mức sử dụng bộ nhớ của mình trong khi các trình phân tích cú pháp đó đang chạy không? Tôi tò mò chương trình chạy bao lâu trước khi bạn quyết định nó đã bị đóng băng? –

0

OK, tôi đã có thể phân tích cú pháp.

Thành thật mà nói, đây không phải là giải pháp thanh lịch nhất, nhưng với một thời gian tuyệt vọng, một cách nhanh chóng để phân tích cú pháp tệp JSON là kiểm tra tệp theo cách thủ công, chú ý một mẫu và lấy ra những gì bạn cần.

Trong trường hợp của tôi, đây là những gì tôi đã làm trong mã giả

fileStr = File.read("hugeJSONfile.json") 
arr = fileStr.split("[some pattern]") 
arr.each do |str| 
    extract desired value from str 
end 

Một lần nữa, không phải là giải pháp thanh lịch nhất, nhưng nó bảo trì thấp, và tùy thuộc vào hoàn cảnh nhất định, chỉ thích ứng với những gì máy tính xách tay không hấp dẫn của bạn có thể muster.

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