2015-11-09 22 views
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; 
} 
+0

你嘗試了嗎?在'unmap'之前,我只使用'mmap'與'open'和'close'並且從不'關閉'文件描述符。 – mch

+0

這似乎是一個「令人尷尬的平行」問題。考慮一種將您的堆棧分割成更小的子陣列網格的方法。您可以使用線程或隊列方法在較小的子陣列上進行像素中值計算,其方式使得一系列子陣列適合內存。 –

+0

這個程序的一個主要開銷是使用dcraw轉換原始圖像。我只想做一次轉換。 – chasep255

回答