Tôi có một công việc đang chạy trên sản xuất xử lý các tệp xml. tệp xml có kích thước khoảng 4k và kích thước từ 8 đến 9 GB tất cả cùng nhau.Errno :: ENOMEM: Không thể cấp phát bộ nhớ - cat
Sau khi xử lý, chúng tôi nhận tệp CSV dưới dạng đầu ra. Tôi đã một lệnh mèo này sẽ hợp nhất tất cả các file CSV vào một tập tin duy nhất tôi nhận được:
Errno :: ENOMEM: Không thể cấp phát bộ nhớ
trên cat
(backtick) lệnh.
Dưới đây là vài chi tiết:
- Hệ thống Memory - 4 GB
- Swap - 2 GB
- Ruby: 1.9.3p286
tập tin được xử lý bằng nokogiri
và saxbuilder-0.0.8
.
Ở đây, có một khối mã sẽ xử lý 4.000 tệp XML và đầu ra được lưu trong CSV (1 trên xml) (xin lỗi, tôi không giả sử chia sẻ nó b'coz về chính sách của công ty).
Dưới đây là đoạn code này sẽ hợp nhất các tập tin đầu ra vào một tập tin duy nhất
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
Tôi đã lấy ảnh chụp nhanh tiêu thụ bộ nhớ trong processing.It tiêu thụ hầu hết các phần của bộ nhớ, nhưng nó sẽ không Thất bại. Luôn thất bại theo lệnh cat
.
Tôi đoán, khi quay lại, nó cố gắng chia rẽ một quy trình mới không có đủ bộ nhớ để không thành công.
Hãy cho tôi biết ý kiến của bạn và thay thế cho điều này.
IMO có ý nghĩa khi thực sự hiển thị những gì bạn đang làm. –
@DaveNewton Tôi đã chỉnh sửa bài đăng của mình, cảm ơn câu trả lời của bạn – Atith
Bạn có thể có rất ít bộ nhớ để điều này xảy ra, bạn có chắc là bạn còn đủ bộ nhớ không? Đầu ra của '' free -m'' là gì? – Intrepidd