簡體   English   中英

加載巨大的(8GB)二進制文件並將其移入內存C ++ Linux 64bit

[英]loading huge (8GB) binary file and shifting it in memory C++ Linux 64bit

我正在嘗試將8GB二進制文件讀入內存並進行操作。 文件包含序列HEADER,DATA,HEADER,DATA ....,我想將其(在內存中)移動到:DATA,DATA,DATA,...

它是灰度16位圖像數據。

我的問題是,我只能使用順序編碼(代碼跟隨),因為.read()函數僅適用於32位寄存器,並且下面的指針僅允許我具有32bit最大無符號短褲數。

我有什么想念的嗎? 它在具有64GB RAM的64位linux上,所以足夠了。 (並且確實需要一次全部存儲在內存中)我能以某種方式獲得比[2 ^ 32]更多的指針嗎? 如果我猜是我唯一的選擇,那么我可以依次讀取它們。

編輯:我更新了我的代碼,它沒有任何抱怨,只有備忘錄給我分段錯誤(對於j> = 448)。 有什么想法嗎?

示例代碼:

const unsigned int HEADERSIZE=384;
ifstream fs;
fs.open("./myfile.bin", ios::in | ios::binary);

unsigned short *tmp0 = new unsigned short [256*256*256*256+HEADERSIZE/2*256*256];
unsigned short *tmpNoHead = new unsigned short [256*256*256*256];

fs.read((char*)tmp0, 2*256*256*256*256+HEADERSIZE*256*256);
//endian swap
unsigned char*c0 = (unsigned char*)tmp0;
for (long i = 0; i < HEADERSIZE*256*256+256*256*256*256*2; i += 2)
swap(c0[i], c0[i + 1]);

//memmove or memcpy seg fault if j>=448
for (int j = 0; j<256*256;j++) memmove(tmpNoHead+j*256*256,c0+HEADERSIZE*(j+1)+j*256*256*2,256*256*2);

fs.close();
return 0;

在64位系統上,盡管short是16位,而int仍然是32位,但指針是64位,因此您確實可以使用short *或int *指針訪問整個8GB數據數組。

為了向自己證明這一點,您可以運行以下命令:

printf("sizeof(short*) = %lu\n", sizeof(short*));

在我的64位計算機上,打印8(64位)。

請注意i + j * DATA_SIZE行,如果總和可能超過2 ^ 31,則應將i和j設為長整數。

暫無
暫無

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

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