2013-03-15 16 views
5

Tôi có một vectơ rất lớn (hàng triệu mục nhập mỗi 1024 byte). Tôi vượt quá kích thước tối đa của vector (nhận được một ngoại lệ phân bổ bộ nhớ xấu). Tôi đang thực hiện phép toán đệ quy trên vectơ của các vật phẩm đòi hỏi phải truy cập vào các phần tử khác trong vectơ. Các hoạt động cần phải được thực hiện nhanh chóng. Tôi đang cố gắng tránh ghi vào đĩa vì lý do tốc độ. Có cách nào khác để lưu trữ dữ liệu này không yêu cầu ghi vào đĩa không? Nếu tôi phải ghi dữ liệu vào đĩa, thì cách lý tưởng nhất để làm điều đó là gì:C++ véc tơ ra khỏi bộ nhớ

chỉnh sửa thêm một vài chi tiết.

Các hoạt động mà tôi đang thực hiện trên tập dữ liệu đang tạo chuỗi theo cách đệ quy dựa trên các điểm dữ liệu khác trong vectơ. Dữ liệu được sắp xếp khi nó được đọc. Bộ dữ liệu từ 50.000 đến 50.000,0000.

+5

Chúng tôi thực sự không thể nói bất cứ điều gì mà không biết thêm về dữ liệu của bạn. – NPE

+0

Cần bao nhiêu bộ nhớ? Bạn có bao nhiêu bộ nhớ? –

+3

Bạn có cần phải có bộ nhớ tiếp giáp cho bất kỳ điều gì bạn đang làm không? Nếu không, thay đổi dễ dàng sẽ là sử dụng 'std :: deque' thay thế; nó sẽ cho phép bạn lưu trữ nhiều yếu tố hơn trước khi hết bộ nhớ. – Praetorian

Trả lời

-1

Đó là 1GB bộ nhớ (1024KB * 10^6 = 1MB * 10^3 = 1GB). Lý tưởng nhất cho một máy 32 bit tối đa 4GB hoạt động bộ nhớ có thể được thực hiện. Để trả lời câu hỏi của bạn, trước tiên hãy thử gọi hàm malloc() bình thường và phân bổ 1 GB bộ nhớ. Điều này nên được thực hiện mà không có bất kỳ lỗi nào. Ngoài ra, vui lòng dán thông báo lỗi chính xác mà bạn nhận được khi sử dụng vectơ.

+0

Chỉ là thông tin hữu ích duy nhất mà OP đưa ra trong câu hỏi là lỗi mà anh ta gặp phải - * ngoại lệ cấp phát bộ nhớ xấu *, aka ['std :: bad_alloc'] (http://en.cppreference.com/w/cpp/ memory/new/bad_alloc) – Praetorian

+0

sử dụng ** malloc ** là câu trả lời :) –

+1

Đó là câu trả lời sai. Câu hỏi nói hàng triệu, không phải 1 triệu. Thậm chí giả sử nó chỉ có 2-3 triệu, không có gì đảm bảo rằng một máy 32 bit có thể phân bổ 2-3 GB không gian địa chỉ liền kề. Một số không gian địa chỉ sẽ được sử dụng cho hạt nhân, cho các thư viện được chia sẻ, cho ngăn xếp, v.v. –

9

Cách dễ nhất để giải quyết vấn đề này là sử dụng STXXL. Đó là một reimplementation của STL cho các cấu trúc lớn mà minh bạch ghi vào đĩa khi dữ liệu sẽ không phù hợp trong bộ nhớ.

+0

Cảm ơn điều này sẽ giúp bạn. – user2174896

+4

Nếu dữ liệu phải tiếp giáp nhau, STXXL sẽ giúp đỡ như thế nào? Bất kỳ loại ghi vào đĩa (minh bạch hay không) phá vỡ tiếp giáp. – Yakk

+0

@Yakk, nó không thực sự tiếp giáp, nó chỉ trình bày cùng một giao diện như 'std :: vector'. Câu hỏi không yêu cầu nó được tiếp giáp, hoặc ít nhất là nó không khi tôi đăng câu trả lời. –

0

Vì dữ liệu của bạn phải liền nhau và bạn biết cần lưu trữ bao nhiêu phần tử, chỉ cần tạo std::vector và sử dụng chức năng reserve() để cố gắng đạt được khối bộ nhớ liền kề về kích thước yêu cầu.

Có rất ít chi phí lưu trữ một véc-tơ (chỉ một vài con trỏ để quản lý đầu và cuối). Điều này là tốt như bạn sẽ có thể làm.

Nếu thất bại:

  • thêm bộ nhớ hơn để máy tính của bạn (có thể không thực sự giúp đỡ, nếu bạn đã chạy lên chống lại việc giải quyết hoặc thực hiện chế)
  • chuyển sang một mảng nguyên
  • tìm một cách để giảm kích thước của các yếu tố của bạn
  • cố gắng để tìm một giải pháp có thể giải quyết vấn đề trong các khối nhỏ
+1

Thêm bộ nhớ vào máy của bạn sẽ không làm gì trên hệ điều hành hiện đại với kích thước tối đa của 'vectơ', giả sử người dùng đã cho phép đủ bộ nhớ ảo. Phân bổ là về tiêu thụ không gian địa chỉ, không phải bộ nhớ. Thậm chí sau đó, một hệ điều hành có thể blythly đưa ra không gian địa chỉ nhiều hơn họ có bộ nhớ ảo cho, và chỉ thất bại khi bộ nhớ thực sự được sửa đổi. – Yakk

+0

Ah, đúng. cảm ơn bạn. –

+0

Thats chính xác những gì tôi figured. Cảm ơn. – user2174896

3

Vấn đề của bạn không thể được giải quyết như đã nêu và làm rõ trong các ý kiến.

Bạn đã yêu cầu một cách để có bộ đệm trong bộ nhớ tiếp giáp với 50.000.000 mục có kích thước 1024 trên hệ thống 32 bit.

Hệ thống 32 bit chỉ có 4294967296 byte bộ nhớ địa chỉ. Bạn đang yêu cầu 51200000000 byte bộ nhớ địa chỉ, hoặc 11,9 lần số lượng không gian địa chỉ bộ nhớ trên hệ thống của bạn.

Nếu bạn không yêu cầu dữ liệu của bạn tiếp giáp và nhớ địa chỉ, nếu bạn không yêu cầu tất cả dữ liệu trong bộ nhớ cùng một lúc hoặc nếu bạn thư giãn các yêu cầu khác, có thể có câu trả lời cho bạn vấn đề. Tức là, một số hệ điều hành tiếp xúc với một không gian bộ nhớ của các giá trị tương ứng với RAM (có cách thức trong hệ thống cửa sổ 8 gig sử dụng hơn 4 hợp đồng RAM tổng số) thông qua một số giao diện hacky hoặc khác.

Nhưng như đã nêu, câu trả lời là "không, bạn không thể làm điều đó".

+0

Đó là những gì tôi đã tìm. Cảm ơn. – user2174896

+1

@ user2174896 phải rõ ràng, câu trả lời của tôi có nghĩa là "bạn đang đặt câu hỏi sai", không phải "bạn không thể giải quyết vấn đề thực tế của mình". Tôi mạnh mẽ nghi ngờ vấn đề thực tế của bạn là "51200000000 byte không gian bộ nhớ liên tục trên một hệ điều hành 32 bit" – Yakk