0
我正在研究堆疊天文圖像的程序。它將涉及將數百個16位RGB圖像存儲在存儲器中進行處理。我不能一次處理一個圖像,因爲在某些情況下,我想要獲取每個像素的中值。我決定創建臨時文件並將mmap映射到它們,這樣我就可以使用我的圖像api,因爲正常內存中的圖像或mmaped之間沒有任何變化,因爲內核應該在後臺處理訪問文件的必要部分。我發佈這個,因爲我只是想確保我做得正確。如果我只有16GB內存+ 8GB交換分區,此方法是否可以加載50GB圖像(假設)?這是一個有效的存儲器映射使用來存儲大量的數據?
typedef struct
{
size_t w;
size_t h;
pixel_t px[];
} image_t;
//allocate in normal memory
image_t* image_new(size_t w, size_t h)
{
assert(w && h);
image_t* img = malloc(sizeof(image_t) + sizeof(pixel_t) * w * h);
if(!img)
return NULL;
img->w = w;
img->h = h;
memset(img->px, 0, sizeof(pixel_t) * w * h);
return img;
}
image_t* image_mmap_new(image_t* img)
{
FILE* tmp = tmpfile();
if(tmp == 0)
return NULL;
size_t wsize = sizeof(image_t) + sizeof(pixel_t) * img->w * img->h;
if(fwrite(img, 1, wsize, tmp) != wsize)
{
fclose(tmp);
return NULL;
}
image_t* nimg = mmap(NULL, wsize, PROT_WRITE | PROT_READ, MAP_SHARED, fileno(tmp), 0);
fclose(tmp);
return nimg;
}
你嘗試了嗎?在'unmap'之前,我只使用'mmap'與'open'和'close'並且從不'關閉'文件描述符。 – mch
這似乎是一個「令人尷尬的平行」問題。考慮一種將您的堆棧分割成更小的子陣列網格的方法。您可以使用線程或隊列方法在較小的子陣列上進行像素中值計算,其方式使得一系列子陣列適合內存。 –
這個程序的一個主要開銷是使用dcraw轉換原始圖像。我只想做一次轉換。 – chasep255