2011-02-08 24 views
5

Tôi có đoạn mã sau:Memory lỗi kiệt sức cho json_parse với PHP

<?php 
$FILE="giant-data-barf.txt"; 

$fp = fopen($FILE,'r'); 

//read everything into data 
$data = fread($fp, filesize($FILE)); 
fclose($fp); 

$data_arr = json_decode($data); 
var_dump($data_arr); 
?> 

Các tập tin khổng lồ dữ liệu-barf.txt là, như tên gọi của nó cho thấy, một file lớn (đó là 5.4mb ngay bây giờ, nhưng nó có thể đi lên đến vài GB)

Khi tôi thực hiện kịch bản này, tôi nhận được lỗi sau:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in ........./data.php on line 12 

tôi nhìn giải pháp khả thi, và thấy điều này:

ini_set('memory_limit','16M'); 

và câu hỏi của tôi là, có giới hạn về mức độ lớn nên đặt bộ nhớ của mình không? Hoặc là có một cách tốt hơn để giải quyết vấn đề này?

+1

Đây có thể không phải là công việc mà PHP hoàn toàn phù hợp. Bạn có thể sử dụng các công cụ dòng lệnh không? –

+2

lưu trữ tệp phẳng của tệp có kích thước sẽ khiến bạn gặp nhiều sự cố. Sử dụng sqlite hoặc mysql. nếu tập tin chỉ chứa một biến đã được mã hóa json và nó là rất lớn, nó không chắc bạn sẽ có thể giải quyết điều này. json không có nghĩa là cho các tập tin lớn như vậy. Sử dụng cơ sở dữ liệu, hoặc lưu trữ nó trong CSV, hoặc lưu trữ mỗi hàng trong json thay vì toàn bộ điều – Jason

+0

Vấn đề duy nhất là, ai đó đang xuất khẩu cho tôi toàn bộ DB ở định dạng JSON ... –

Trả lời

8

THIS IS A ý kiến ​​rất xấu, những gì đã nói, bạn sẽ cần phải thiết lập

ini_set('memory_limit',filesize($FILE) + SOME_OVERHEAD_AMOUNT); 

vì bạn đang đọc toàn bộ nội dung trong bộ nhớ. Bạn rất có thể phải thiết lập giới hạn bộ nhớ để hai lần so với kích thước của tập tin kể từ khi bạn cũng muốn JSON_DECODE

LƯU Ý RẰNG trên Máy chủ Web NÀY SẼ tiêu thụ một lượng lớn bộ nhớ và bạn sẽ KHÔNG LÀM NÀY NẾU FILE S BE NHIỀU GIGABYTES NHƯ BẠN NÓI !!!!

Thực sự có phải là khổng lồ JSON blob? Bạn nên xem xét chuyển đổi dữ liệu này sang cơ sở dữ liệu hoặc định dạng khác mà bạn có thể sử dụng truy cập ngẫu nhiên hoặc hàng với trước khi phân tích cú pháp bằng PHP.

2

Tôi đã cung cấp tất cả các máy chủ của mình là memory_limit trong số 100 triệu ... chưa gặp sự cố.

tôi sẽ xem xét tách lên tập tin đó bằng cách nào đó, hoặc thoát khỏi nó và sử dụng một cơ sở dữ liệu

+0

có cách nào để nhập tệp JSON vào DB không? –

+1

@TonyStark sử dụng ứng dụng được viết bằng văn bản tùy chỉnh để lấy tệp đó và chuyển đổi nó thành một thứ gì đó mà MySQL hiểu được. Để làm điều đó bằng cách sử dụng các công cụ hiện tại? Tôi nghi ngờ điều đó. Có nhiều cách tốt hơn để giải quyết vấn đề này. – jcolebrand

+0

dunnow ... không bao giờ làm điều này trước đây:/ –

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