簡體   English   中英

為std :: vector分配幾GB的內存

[英]Allocate several GBs of memory for std::vector

我需要從傳感器獲取數GB的數據。 當我嘗試使用malloc(10或更多GB。我的系統有32GB)分配大數組時,它返回NULL。 因此,我認為可以通過將迭代器鏈接到向量的列表來解決該問題。

但是我不知道該如何設置。 我嘗試聲明“ list <vector :: iterator>”,但無法為每個向量分配內存(e / o應該具有1000〜2000個元素)。 您知道執行此操作的任何方法,還是針對此大內存分配的更好解決方案?

如果使用的是64位操作系統,則malloc應該能夠毫無問題地分配較大的大小。

例如,此代碼在我的Windows計算機(64位Windows)上運行,並完美地分配了10GB的ram:

#include <stdio.h>
#include <malloc.h>
int main(int argc, char *argv[]) {
    long int size = 10L * 1024 * 1024 * 1024;
    printf("size = %ld\n", size);
    char *x = (char *)malloc(size);
    printf("x = 0x%lx\n", x);
    long int i;
    for (i = 0; i < size; i += 1024*1024) {
        x[i] = 'h';
    }
    printf("Done1\n");
}

但是,如果您使用的是32位操作系統,則會遇到麻煩,並且無法分配一定的限制(可能是3 GB,但可能取決於系統)

在這種情況下,您需要將數據寫入文件。

但是,如果您使用的是胖文件系統,則也無法寫入那么大的文件。 在這種情況下,您必須將數據分割成大小小於2gb的許多文件。

您需要實際檢查malloc結果是否為NULL,以確保malloc可以工作並且可以獲取內存。

對於這種數據量,我通常移至內存映射文件或共享內存映射。

這樣,您完全不必受限於可用的物理(進程)內存量。 您可以根據需要讓OS頁面進入和退出。 分段變得不再是一個問題(除非您實際對邏輯地址空間進行分段,這在64位體系結構上很難實現)。


更多信息

我在SO上有很多答案,這些例子顯示了在共享內存/映射文件中存儲向量和所有更復雜的數據結構的所有方式的示例。 你可能想尋找mapped_file_device (從升壓IOSTREAMS)或managed_shared_memorymanaged_mapped_file (從升壓進程間)

您將需要在Windows 64位OS下分配此空間。 您還必須設置“大地址空間感知”標志,否則,由於虛擬內存系統在Windows上的工作方式,您只能獲得2 GB的RAM。

如果您不一定非要擁有一個很大的10 GB連續內存塊,那么您可能想研究使用內存映射文件,這是sehe在他的回答中建議的。 如果必須為Windows 32位構建應用程序,那么這將是唯一的答案,因為Windows 32位通常僅允許2 GB內存,除非為“大地址空間感知”標志設置了該選項,否則它將允許3 GB的內存使用量。

當您必須處理大塊內存時,最好完全跳過malloc並直接轉到用於內存分配的操作系統調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM