关于 C++读取大小为 2.51 GB (2,701,131,776 字节)到 char* yuanshuju 数组中去

48 天前
 SmartTom
如题,现在想实现将这个大文件(大小超过 int 最大范围)的文件放入到 char* yuanshuju = new char[2,701,131,776]中
现在就卡在第一步定义 yuanshuju 这一步,qt 一直提示"terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc",本人没太做过 c++,这个提示是代表不能定义那么大的数组吗?还有别的可行方案吗。
系统:win11 64 位
QT: 5.12.12
2635 次点击
所在节点    程序员
45 条回复
yougg
48 天前
先把变量名改为 metadata 吧, 看到这里就难受无法继续阅读了......
proxytoworld
48 天前
同意一楼的
iOCZS
48 天前
是 rawdata ,不是 metadata
@yougg
deplives
48 天前
这个 yuanshuju 血压升高
Mithril
48 天前
用 memory mapping ,不要手动去读它。
silentx
48 天前
是啥东西要一次性读到内存里处理?不考虑分段读吗?不是每个人的机器都是 32G 内存起步的啊。。。
maokg
48 天前
不知道一次性读 2.51GB 数据的应用场景是什么
SmartTom
48 天前
@deplives 哈哈 我也是接手别人的项目,这不是我的风格。
geelaw
48 天前
new char[2,701,131,776] 会分配长度是 776 个元素的 char 数组,不是你期待的 2.51 GB 。

int main() { new char[2701131776] { }; }

这个程序在我的电脑上编译为 64 位的话可以正常运行,并且确实占用了 2.51 GB 内存,如果用 32 位编译器则编译失败,因为分配的数组规模超过了 size_t 。

抛出 std::bad_alloc 的意思就是分配失败,或许你的页面文件和实体内存不够大。

如果数据来自于文件,可以用内存映射文件,Windows 的文档是 https://learn.microsoft.com/en-us/windows/win32/memory/file-mapping
POSIX 的文档是 https://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html
SmartTom
48 天前
@maokg 光谱数据处理,体谅挺大的
Crawping
48 天前
理论 64 位程序的寻址空间是可以到 2'64 次字节
```C++
//你是真的这么写的 还是手写拷贝的? 中间为啥会有 ',' 逗号
char* yuanshuju = new char[2,701,131,776]
```
学其他语言问 GPT 比发帖要来得快
geelaw
48 天前
@geelaw #9 没有超过 size_t (((φ(◎ロ◎;)φ))) 是 MSVC 只支持至多 2147483647 个元素。
SmartTom
48 天前
@Crawping 这个我的问题,我是手动在编辑标题的时候赋值计算器里面的值,实际是去掉','的
yougg
48 天前
@iOCZS #3 "元数据"不是"原始数据"
tool2d
48 天前
我用 malloc ,别说是 malloc(2701131776)可以, 就算 malloc(4701131776)也行。

应该只是你内存不够的原因。”不够“不是说总剩余内存不够,而是无法分配一块巨大内存。
shuax
48 天前
改成 64 位轻轻松松。
greycell
48 天前
笑死,元数据 2 个 g ,还在嘴硬。
MoYi123
48 天前
建议发一下编译器的版本

或者试试看这样写
auto alloc = vector<int64_t>(2701131776 / 8 + 1);
char* yuanshuju = reinterpret_cast<char*>(alloc.data());
clue
48 天前
能流式处理不? 为什么一定要全读到内存里?
royking930911
48 天前
从原数据着手吧 一次申请几个 G 的内存就算这次运行不出问题 下次也会崩
修改方法:1,分段读取 分段解析
2,优化算法 保存分段前后缓存数据和状态

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1025635

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX