gpt4 book ai didi

c++ - 加载巨大的(8GB)二进制文件并将其移动到内存中 C++ Linux 64bit

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:35 33 4
gpt4 key购买 nike

我正在尝试将 8GB 的​​二进制文件读入内存并对其进行操作。文件包含序列 HEADER, DATA, HEADER, DATA, .... 我想将它(在内存中)转移到:DATA, DATA, DATA, ...

灰度16bit图像数据。

我的问题是我只能使用连续的 uproach(代码如下),因为 .read() 函数只适用于 32 位寄存器,而且下面的指针只允许我拥有 32 位最大数量的无符号短裤。

有什么我想念的吗?它在具有 64GB RAM 的 64 位 Linux 上,所以这足够了。 (而且它真的需要在内存中一次全部)我能以某种方式得到比 [2^32] 更多的指针吗?如果 read 是我唯一的选择,我可以将它按顺序读入它们。

编辑:我更新了我的代码,它没有提示任何事情,只有 memove 给我段错误(对于 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 访问整个 8GB 数据数组* 或 int* 指针。

为了向你自己证明这一点,你可以运行这个:

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

在我的 64 位机器上,打印了 8(64 位)。

小心你的 i+j*DATA_SIZE 行,如果总和超过 2^31 你应该把 i 和 j 设为长整数。

关于c++ - 加载巨大的(8GB)二进制文件并将其移动到内存中 C++ Linux 64bit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34890754/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com