2011-09-12 15 views
5

Tôi đang phát triển trình ghi nhật ký/sniffer bằng Delphi. Trong quá trình hoạt động, tôi nhận được lượng dữ liệu khổng lồ, có thể tích lũy trong các hoạt động căng thẳng tới khoảng 3 GB dữ liệu. Trên một số máy tính nhất định khi chúng tôi đến các cấp đó, ứng dụng sẽ ngừng hoạt động và đôi khi sẽ ném ngoại lệ.Phương pháp phân bổ nào để sử dụng cho ứng dụng ghi nhật ký khối lượng lớn?

Hiện tại tôi đang sử dụng chức năng GetMem để cấp phát con trỏ cho từng thư.

Có cách nào tốt hơn để phân bổ bộ nhớ để tôi có thể giảm thiểu cơ hội bị lỗi không? Hãy nhớ rằng tôi không thể giới hạn kích thước đến một giới hạn cứng.

Bạn nghĩ gì về việc sử dụng HeapAlloc, VirtualAlloc hoặc thậm chí có thể tệp được ánh xạ? Mà sẽ tốt hơn?

Cảm ơn bạn.

+1

Bạn có thể sử dụng trình ghi nhật ký khối lượng lớn hiện tại, như [Flume] (https://cwiki.apache.org/FLUME/) không? – Barend

+1

phân bổ ít bộ nhớ hơn hoặc chuyển sang 64 bit delphi –

+0

@Barend đây là một trình ghi nhật ký trong nhà thời gian thực nhận thông tin từ tất cả các quy trình của chúng tôi + dữ liệu USB (công ty của tôi làm việc với điện thoại di động và trong khi liên lạc tất cả các gói usb được thêm vào bộ ghi) . Tôi không nghĩ rằng một logger đã sẵn sàng sẽ có thể xử lý một cách chính xác. – Ran

Trả lời

5

Vấn đề cơ bản của bạn là giới hạn không gian địa chỉ cứng 4GB đối với các quy trình 32 bit. Vì bạn đang gặp vấn đề ở mức 3GB, tôi chỉ có thể đoán rằng bạn đang sử dụng /LARGEADDRESSAWARE chạy trên Windows 64 bit hoặc Windows 32 bit với công tắc khởi động/3GB.

Tôi nghĩ rằng bạn có một vài lựa chọn, bao gồm nhưng không giới hạn như sau:

  1. Sử dụng ít bộ nhớ. Có lẽ bạn có thể xử lý các đoạn nhỏ hơn hoặc đẩy một số bộ nhớ vào đĩa.
  2. Sử dụng 64 bit Delphi (vừa mới phát hành) hoặc FreePascal. Điều này giúp bạn giảm bớt ràng buộc về không gian địa chỉ nhưng hạn chế bạn với các phiên bản Windows 64 bit.
  3. Sử dụng các tệp được ánh xạ bộ nhớ. Trên máy có nhiều bộ nhớ, đây là cách để truy cập vào bộ nhớ cache của bộ nhớ hệ điều hành. Các tệp ánh xạ bộ nhớ không dành cho những người yếu tim.

Tôi không thể tư vấn chắc chắn về giải pháp vì tôi không biết kiến ​​trúc của bạn nhưng theo kinh nghiệm của tôi, việc giảm dung lượng bộ nhớ của bạn thường là giải pháp tốt nhất.

Sử dụng trình phân bổ khác có khả năng tạo ra sự khác biệt nhỏ. Có đúng là có phân bổ phân mảnh thấp nhưng họ chắc chắn sẽ không thực sự giải quyết vấn đề của bạn. Tất cả những gì họ có thể làm sẽ khiến nó ít có khả năng nảy sinh hơn.

+3

Các tệp ánh xạ bộ nhớ có thể là một cách để tiến lên phía trước, nhưng bạn có thể sẽ phân bổ tối đa có thể. Và bạn sẽ có ánh xạ phức tạp cho> 3Gb. Nó tấn công tôi rằng tùy chọn tốt nhất sẽ là mã hóa thông điệp tường trình để giảm yêu cầu bộ nhớ. Vì vậy, bạn có thể có "lỗi" và "bắt đầu" và "mở" giảm xuống một byte đơn - nó có thể mất một số phân tích tĩnh để làm việc ra những gì là phổ biến, nhưng có thể giảm một nửa yêu cầu một cách nhanh chóng. – mj2008

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