2008-09-29 27 views
37

Tôi thích phát triển các thuật toán bằng cách sử dụng STL, tuy nhiên, tôi có vấn đề này lặp đi lặp lại nơi tập dữ liệu của tôi quá lớn cho vùng heap.Các lớp chứa STL được hỗ trợ đĩa?

Tôi đã tìm kiếm các thay thế thả xuống cho các vùng chứa STL và các thuật toán được sao lưu đĩa, tức là các cấu trúc dữ liệu được lưu trữ trên đĩa chứ không phải là vùng heap.

Một người bạn gần đây đã chỉ cho tôi về phía stxxl. Trước khi tôi quá tham gia với nó ... Có bất kỳ thay thế STL đĩa sao lưu khác có sẵn mà tôi nên xem xét không?

LƯU Ý: Tôi không quan tâm đến sự kiên trì hoặc cơ sở dữ liệu được nhúng. Xin vui lòng không đề cập đến tăng :: serialization, POST ++, Thư viện mẫu quan hệ, Berkeley DB, sqlite, vv Tôi nhận thức được những dự án này và sử dụng chúng khi chúng thích hợp cho mục đích của tôi.

UPDATE: Một số người đã đề cập đến tập tin bộ nhớ lập bản đồ và sử dụng một cấp phát tùy chỉnh, gợi ý tốt BTW, nhưng tôi sẽ chỉ cho họ để thảo luận here nơi David Abraham gợi ý rằng lặp tùy chỉnh sẽ là cần thiết cho container đĩa hậu thuẫn . Có nghĩa là phương pháp phân bổ tùy chỉnh không có khả năng hoạt động.

+0

Nếu bộ dữ liệu của bạn quá lớn, bạn nên cân nhắc xem cấu trúc hệ thống của mình có chính xác hay không (ví dụ: có chuyển sang hệ thống 64 bit hay không; các câu hỏi này phổ biến hơn khi được hỏi). Bạn cũng nên xem xét liệu STL có phải là cách tiếp cận đúng hay không; nó có thể làm cho các giả định về kích thước tập dữ liệu mà không giữ cho bạn. –

+0

@Donal Anh ấy có thể không đặt đúng số lượng bộ nhớ. –

Trả lời

10

Tôi đã thực hiện một số điều rất giống nhau. Việc thực hiện các trình vòng lặp là thử thách nhất. Tôi đã sử dụng boost::iterator_facade để triển khai trình lặp. Sử dụng boost::iterator_facade bạn có thể dễ dàng điều chỉnh mọi bộ nhớ cache trên cấu trúc dữ liệu đĩa để có giao diện vùng chứa STL.

+0

Tôi sử dụng Boost, nhưng iterator_facade là mới đối với tôi. Tôi sẽ phải xem xét điều đó, cảm ơn bạn đã chia sẻ. – paxos1977

+0

Chăm sóc để chia sẻ việc triển khai? –

+0

Rất tiếc, tôi không thể chia sẻ mã đó. Tuy nhiên nếu bạn có bất kỳ câu hỏi nào, tôi sẽ rất sẵn lòng trợ giúp. – Ted

2

Tôi không biết nhiều về chủ đề, nhưng có thể viết giao diện giống như STL vào một tệp ánh xạ bộ nhớ?

chỉnh sửa: Cách tiếp cận này có thể phù hợp nếu bạn đang cố gắng lấy một phần cụ thể của một tệp lớn. Nếu bạn đang cố gắng làm một cái gì đó với toàn bộ tập tin, bạn sẽ có khả năng tạo ra một số lượng lớn các lỗi trang khi bạn đọc trong các phần không được đính kèm của tệp.

+0

Tôi đã cân nhắc việc làm điều này ... nhưng tôi không muốn tự viết nó nếu có điều gì đó có thể sử dụng đã được thực hiện. – paxos1977

+0

Tôi có thể đánh giá cao việc không muốn phát minh lại bánh xe. Tôi không quen thuộc với một thư viện thực hiện điều này; hy vọng ai đó có thể giới thiệu một. – luke

+0

Tôi tin rằng Boost.Interprocess có thể được sử dụng để ghi vào một tập tin ánh xạ bộ nhớ. Đã không thực sự thử nó, mặc dù. –

3

Nếu (khi bạn viết) bạn không quan tâm đến sự kiên trì, giải pháp đơn giản nhất là tăng kích thước heap của bạn và sử dụng các cơ sở bộ nhớ ảo của hệ điều hành của bạn. Một phần của heap sẽ không vừa trong bộ nhớ vật lý của máy tính của bạn sẽ kết thúc được phân trang trên đĩa, cung cấp cho bạn chính xác những gì bạn muốn: STL bình thường truy cập vào dữ liệu thường được lưu trữ trên đĩa. Hệ điều hành sẽ chăm sóc bộ nhớ đệm các trang được sử dụng nhiều nhất trong bộ nhớ vật lý và loại bỏ những đĩa bạn không sử dụng nhiều. Mã của bạn sẽ vẫn như cũ và bạn có thể tăng hiệu suất của nó đơn giản bằng cách thêm bộ nhớ vật lý.

Để tăng kích thước heap của bạn, hãy kiểm tra các thông số của hệ điều hành, như ulimit (1) trên hệ thống Unix và Thuộc tính hệ thống - Nâng cao - Hiệu suất - Nâng cao - Bộ nhớ ảo trên Windows XP. Nếu bạn đã đạt đến giới hạn 32 bit 4GB, hãy cân nhắc việc chuyển sang kiến ​​trúc 64 bit hoặc biên dịch chương trình của bạn cho 64 bit.

+0

Tôi là quản trị viên hệ thống thành thạo, tôi đã xem xét cách tiếp cận mà bạn đề xuất. Tôi có một máy amd64 chạy unix. Tôi không thể đủ khả năng để thêm bộ nhớ vật lý. Không gian hoán đổi của tôi là 2GB, bộ dữ liệu của tôi là 42GB, ổ cứng của tôi là 1TB ... – paxos1977

+1

Vì vậy, làm thế nào để tăng không gian hoán đổi của bạn? – Arkadiy

+0

Chắc chắn, tôi đã nghĩ về việc xây dựng lại máy chủ của mình để phù hợp với dự án này. Tuy nhiên đây không phải là phần cứng chuyên dụng, thay vì một máy được sử dụng cho nghiên cứu chung. Ngoài ra, cuối cùng các cộng tác viên cũng sẽ cần phải chạy mã, và tôi không nghĩ rằng yêu cầu họ phải xây dựng lại máy của họ sẽ hoạt động. – paxos1977

8

Tôi chưa bao giờ phải làm bất cứ điều gì như thế này, nhưng có thể làm những gì bạn muốn làm bằng cách viết một trình phân bổ tùy chỉnh sử dụng các tệp ánh xạ bộ nhớ để sao lưu dữ liệu của bạn.

Xem boost::interprocesses cho tài liệu trên dễ dàng để sử dụng thực hiện của họ về bộ nhớ ánh xạ các file, this Dr. Dobbs article cho một cuộc thảo luận chi tiết về viết allocators, và this IEEE Software column cho một mô tả của vấn đề và example code.

+0

Tôi biết về bài viết DDJ, bài viết hay. Tuy nhiên, đã có một cuộc thảo luận về danh sách gửi thư của boost giữa Terpstra, Kuehl, & Abraham cho rằng các trình vòng lặp tùy chỉnh sẽ cần thiết để xử lý các cấu trúc dữ liệu trên đĩa ... loại quy tắc nào trong phương thức phân bổ tùy chỉnh. – paxos1977

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