2009-09-15 68 views
8

Tôi đã viết một chương trình phân tích mã nguồn của dự án và báo cáo các vấn đề và số liệu khác nhau dựa trên mã.Ngăn ngừa các vấn đề về bộ nhớ khi xử lý một lượng lớn văn bản

Để phân tích mã nguồn, tôi tải các tệp mã tồn tại trong cấu trúc thư mục của dự án và phân tích mã từ bộ nhớ. Mã này trải qua quá trình xử lý mở rộng trước khi nó được chuyển cho các phương pháp khác để phân tích thêm.

Mã được chuyển đến một số lớp khi được xử lý.

Ngày khác tôi đang chạy nó trên một trong những dự án lớn hơn nhóm của tôi có, và chương trình của tôi thèm muốn tôi vì có quá nhiều mã nguồn được nạp vào bộ nhớ. Đây là một trường hợp góc vào thời điểm này, nhưng tôi muốn có thể xử lý vấn đề này trong tương lai.

Cách tốt nhất để tránh các vấn đề về bộ nhớ là gì?

Tôi đang suy nghĩ về việc tải mã, thực hiện xử lý ban đầu tệp, sau đó nối tiếp kết quả vào đĩa, để khi tôi cần truy cập lại, tôi không phải trải qua quá trình thao tác lại mã thô. Điều này có nghĩa không? Hoặc là serialization/deserialization đắt hơn sau đó xử lý mã một lần nữa?

Tôi muốn giữ mức hiệu suất hợp lý trong khi giải quyết vấn đề này. Hầu hết thời gian, mã nguồn sẽ phù hợp với bộ nhớ mà không có vấn đề, do đó, có cách nào để chỉ "trang" thông tin của tôi khi tôi còn thiếu bộ nhớ? Có cách nào để biết khi nào ứng dụng của tôi sắp hết bộ nhớ?

Cập nhật: Vấn đề không phải là một tệp duy nhất lấp đầy bộ nhớ, tất cả các tệp trong bộ nhớ cùng một lúc lấp đầy bộ nhớ. Ý tưởng hiện tại của tôi là xoay vòng ổ đĩa khi tôi xử lý chúng

+1

Tôi sẽ đi theo cách tiếp cận tuần tự hóa. Nhưng hãy xem mã nguồn của FindBug. Họ làm điều gì đó tương tự và có thể họ đã giải quyết vấn đề này: http://findbugs.sourceforge.net/downloads.html –

+0

Tỷ lệ giữa kích thước trong bộ nhớ và kích thước của các tệp trên đĩa là gì? –

+0

Bạn đã đề cập đến việc truyền các chuỗi giữa các lớp. Tùy thuộc vào cách bạn xử lý các chuỗi, có lẽ một số bản sao đang được thực hiện và vì vậy bạn đang sử dụng nhiều bộ nhớ hơn mức bạn cần. Tôi không biết chính xác C# xử lý các chuỗi như thế nào, nhưng nếu nó sao chép chúng thì đó có thể là vấn đề. – rsethc

Trả lời

3

1.6GB vẫn có thể quản lý được và bản thân nó sẽ không gây ra vấn đề về bộ nhớ. Hoạt động chuỗi không hiệu quả có thể làm điều đó.

Khi phân tích cú pháp mã nguồn, bạn có thể phân tách mã nguồn thành các phần nền nhất định - mã thông báo hoặc bạn gọi chúng là gì. Nếu mã thông báo của bạn kết hợp tài khoản cho toàn bộ mã nguồn, tăng gấp đôi mức tiêu thụ bộ nhớ ngay tại đó. Tùy thuộc vào độ phức tạp của quá trình xử lý mà bạn thực hiện việc cắt xén có thể còn lớn hơn. Di chuyển đầu tiên của tôi ở đây sẽ là xem xét kỹ hơn cách bạn sử dụng dây và tìm cách tối ưu hóa nó - tức là loại bỏ origianl sau lần vượt qua đầu tiên, nén khoảng trắng hoặc sử dụng chỉ mục (con trỏ) thành chuỗi gốc so với các chất nền thực tế - có một số kỹ thuật có thể hữu ích ở đây.

Nếu không có điều nào trong số này có ích hơn tôi sẽ đổi sang đĩa và fro đĩa

+0

Điều này có ý nghĩa, bởi vì tôi có trạng thái khác nhau của tập tin có sẵn, có thể tăng kích thước gấp ba lần –

0

Sử dụng WinDbg với SOS để xem những gì đang nắm giữ trên tham chiếu chuỗi (hoặc những gì từng gây ra việc sử dụng bộ nhớ cực đại).

+0

Nó phải làm với thực tế là thư mục tôi đã phân tích là 1.6GB (bao gồm cả nhị phân biên soạn, nhưng tôi không tải những, số lượng mã vẫn còn lớn) –

0

Lặp lại/khử âm thanh như một chiến lược hay. Tôi đã thực hiện một số tiền hợp lý này và nó rất nhanh. Trong thực tế, tôi có một ứng dụng instantiates đối tượng từ một DB và sau đó serializes chúng vào các ổ đĩa cứng của các nút web của tôi. Nó đã được một thời gian kể từ khi tôi benchmarked nó, nhưng nó đã được serializing vài trăm một giây và có thể hơn 1k trở lại khi tôi được tải thử nghiệm.

Tất nhiên, điều đó phụ thuộc vào kích thước tệp mã của bạn. Các tệp của tôi khá nhỏ.

1

Nếu vấn đề là một bản sao mã của bạn khiến bạn lấp đầy bộ nhớ khả dụng thì có ít nhất hai tùy chọn.

  • serialize thành đĩa
  • nén tệp trong bộ nhớ. Nếu bạn có nhiều CPU, nó có thể nhanh hơn để nén và giải nén thông tin trong bộ nhớ, thay vì bộ nhớ đệm vào đĩa.

Bạn cũng nên kiểm tra xem bạn có đang xử lý đúng đối tượng hay không. Bạn có vấn đề về bộ nhớ do các bản sao cũ của các đối tượng trong bộ nhớ?

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