2010-06-09 33 views
6

Tôi đã slurped trong một tập tin lớn bằng cách sử dụng File :: Slurp nhưng cho kích thước của tập tin tôi có thể thấy rằng tôi phải có nó trong bộ nhớ hai lần hoặc có lẽ nó nhận được thổi phồng bằng cách được biến thành unicode 16 bit. Làm thế nào tôi có thể chẩn đoán tốt nhất loại vấn đề đó trong Perl?Tôi nên sử dụng công cụ nào để tìm ra phân bổ bộ nhớ của mình trong Perl?

Tệp tôi đã thu thập có kích thước 800MB và quy trình perl của tôi phân tích dữ liệu đó đã phân bổ khoảng 1,6 GB khi chạy.

Tôi nhận ra rằng tôi có thể sai về lý do của tôi cho vấn đề này nhưng tôi không chắc chắn cách hiệu quả nhất để chứng minh/bác bỏ lý thuyết của tôi.

Cập nhật:

Tôi đã elminated mã hóa ký tự tinh ranh từ danh sách các nghi phạm. Có vẻ như tôi đang sao chép biến tại một thời điểm nào đó, tôi không thể tìm ra nơi nào.

Cập nhật 2:

Bây giờ tôi đã thực hiện một số điều tra và phát hiện ra rằng nó thực sự chỉ nhận được dữ liệu từ File :: Slurp đó là gây ra vấn đề. Tôi đã có một cái nhìn qua các tài liệu và phát hiện ra rằng tôi có thể lấy nó để trả lại một scalar_ref, ví dụ:

my $data = read_file($file, binmode => ':raw', scalar_ref => 1); 

Sau đó, tôi không nhận được lạm phát bộ nhớ của tôi. Mà làm cho một số ý nghĩa và là điều hợp lý nhất để làm khi nhận được dữ liệu trong tình hình của tôi.

Thông tin về việc xem xét biến nào tồn tại, v.v. thường hữu ích mặc dù cảm ơn.

+0

Bài đăng SO này có thể hữu ích: [Làm cách nào tôi có thể xác định chương trình sử dụng bộ nhớ của chương trình Perl của mình trong Windows?] (http://stackoverflow.com/questions/1115743/how-can-i-programmatically-determine- tôi-perl-chương trình-bộ nhớ-sử dụng-under-windows). – Zaid

+0

Điều này thường thú vị mặc dù dữ liệu ở cấp độ đó đã khiến tôi nhận ra rằng tôi có lỗi này. –

+0

Bạn có đang xóa toàn bộ tệp cần thiết cho quy trình của mình không? Phân tích theo từng dòng có khả thi không? –

Trả lời

4

Có thể Devel::DumpSizes và/hoặc Devel::Size có thể trợ giúp? Tôi nghĩ rằng trước đây sẽ hữu ích hơn trong trường hợp của bạn.

Devel :: DumpSizes - Đặt tên và kích thước theo byte (theo thứ tự tăng dần) của các biến có sẵn tại điểm cho trong tập lệnh.

Devel :: Kích - Perl mở rộng cho việc tìm kiếm sử dụng bộ nhớ của các biến Perl

4

Dưới đây là một số tài nguyên chung về các vấn đề bộ nhớ trong Perl:

Theo như gợi ý của riêng bạn, cách đơn giản nhất để bác bỏ sẽ được để viết một chương trình Perl đơn giản rằng:

  1. Tạo (100M) tập tin lớn của văn bản đơn giản, có lẽ bởi chỉ xuất ra cùng một chuỗi trong một vòng lặp vào một tập tin, hoặc cho các tập tin nhị phân chạy dd lệnh qua system() gọi

  2. đọc các tập tin trong việc sử dụng tiêu chuẩn Perl open()/@a=<>;

  3. tiêu thụ bộ nhớ Measure.

Sau đó lặp lại # 2- # 3 cho tệp 800M của bạn.

Điều đó sẽ cho bạn biết nếu vấn đề là Tệp :: Slurp, một số logic lạ trong chương trình của bạn hoặc một số nội dung cụ thể trong tệp (ví dụ như ascii, mặc dù tôi sẽ bị phản đối nếu kết thúc là lý do)

+0

Tôi dường như đã loại bỏ mã hóa ký tự dodgy. Một cái nhìn gần hơn cho thấy quá trình bắt đầu với khoảng trống tương tự như tập tin sau đó sau khi thực hiện một số công cụ kiểm tra những thứ trong tiêu đề nó tăng gấp đôi lên. Tôi không thể thấy điều gì gây ra điều đó. –

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