2012-03-14 27 views
8

Like GuyFawkes, tôi muốn sử dụng MemoryStream để lưu trữ một lượng lớn dữ liệu, nhưng tiếp tục gặp phải các ngoại lệ 'hết bộ nhớ'.
Câu trả lời của TomTom là những gì tôi muốn làm - sử dụng một triển khai không yêu cầu một khối liền kề - nhưng tôi tự hỏi liệu đã có sẵn bản cài đặt miễn phí chưa, để tôi tự viết một bản?Có một triển khai MemoryStream nguồn mở không sử dụng bộ nhớ tiếp giáp không?

Có ai biết về việc thực hiện lại tốt, miễn phí MemoryStream có thể hoạt động với luồng lớn không?

EDIT:

giải pháp Các MemoryMappedFile là rất thú vị và tôi sẽ nhớ nó cho các dự án khác, tuy nhiên như Henk nói, nó strays quá xa trừu tượng mà MemoryStream đang hướng tới. Cụ thể, yêu cầu của một công suất đã biết.
Dữ liệu mà việc thay thế sẽ xử lý trong một số trường hợp là rất lớn, nhưng trong những trường hợp khác tương đối nhỏ (và không chúng tôi không biết nó sẽ đến khi quá muộn;)); hơn nữa, nhiều trường hợp của lớp sẽ tồn tại cùng một lúc. Cuối cùng, công việc cần thiết để sử dụng MemoryMappedFiles (để xác định kích thước phù hợp cho từng cái) sẽ tương đương với công việc triển khai giải pháp của TomTom.

+4

Một vấn đề tương tự trong StringBuilder đã được sửa trong .NET 4 bằng cách thay đổi việc triển khai để sử dụng dây. Googling "memorystream rope" chỉ tạo ra các hit của các lập trình viên đang ở cuối của một. Hệ điều hành 64 bit là giải pháp trăm đô la. –

+0

OK, tôi đã bỏ lỡ (bar Eric và dtb's là thú vị nhưng không hoàn toàn những gì tôi cần) câu trả lời như là một 'không' và do đó đã thực hiện nó bản thân mình. Nó không đặc biệt phức tạp nhưng tôi sẽ tải nó lên nếu ai đó có thể gợi ý nơi tốt nhất? – sebf

+0

@HansPassant, dây thừng là một điều thú vị, Cảm ơn (Ngay cả khi Googling "memorystream rope" là không chính xác cảm hứng!) Đối với dự án của tôi mặc dù tôi chỉ cần dòng theo thứ tự hàng trăm megabyte, do đó, một danh sách đơn giản trong thực hiện của tôi sufficed. – sebf

Trả lời

0

Không chính xác việc triển khai lại MemoryStream, nhưng hãy cân nhắc xem bạn có thể sử dụng số Memory Mapped File cho yêu cầu của mình hay không.

Tập tin được ánh xạ bộ nhớ có thể giải quyết nhiều lớp vấn đề mà bộ nhớ đệm lớn có thể giải quyết, rất hiệu quả và được hỗ trợ trực tiếp bởi .NET.

+0

Nhưng không phải lúc nào cũng bắt chước một luồng. –

+0

Các tệp ánh xạ bộ nhớ AFAIK phải có kích thước cố định. – Qwertie

+0

Bạn có chắc chắn không? Tôi khá tự tin rằng các tệp được ánh xạ trên bộ nhớ yêu cầu một không gian địa chỉ ảo liền kề trong quá trình của bạn. Chúng không giúp giải quyết vấn đề này. –

1

Bạn yould tạo MemoryMappedFile mà không có tệp, tức là tệp tồn tại trong bộ nhớ hệ thống. Tùy chọn DelayAllocatePages trì hoãn phân bổ cho đến khi bộ nhớ thực sự cần thiết. Bạn cần xác định dung lượng tối đa trước. Sử dụng CreateViewStream Method để tạo luồng.

+0

Cảm ơn bạn và Eric; Tôi đã cố gắng để thực hiện các giải pháp MemoryMappedFile, nhưng nó không phải là khá thích hợp cho trường hợp này tuy nhiên (tôi đã thêm chi tiết thêm cho câu hỏi để giải thích). – sebf

+0

Điều này không yêu cầu chính xác lượng không gian địa chỉ ảo liền kề trong quá trình của bạn, do đó không giải quyết được vấn đề? –

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