[英]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_memory
和managed_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.