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

2024 年 3 月 21 日
 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
4040 次点击
所在节点    程序员
45 条回复
yuzii
2024 年 3 月 21 日
yolee599
2024 年 3 月 21 日
这么大一个数组,我看着都头疼,考虑分多次处理吧,每次大概分配 4096 字节
shawnsh
2024 年 3 月 21 日
大力出奇迹啊,先设计设计
SmartTom
2024 年 3 月 21 日
发现问题了。
问题代码:
qint64 dataSize = 2701131776;
char* yuanshuju = new char[dataSize];
可行代码:
char* yuanshuju = new char[2701131776];

c++,牛 我反正是没搞懂
SmartTom
2024 年 3 月 21 日
@yolee599 是头疼,等一次采集任务结束,还要处理 50GB 的数据,哎~
iold
2024 年 3 月 21 日
@SmartTom #24 试试使用文档中提供的宏呢?
zhangshaohan
2024 年 3 月 21 日
我还以为是 yushengjun (余胜军)
amorphobia
2024 年 3 月 21 日
@SmartTom

C++ 标准不支持“柔性数组/变长数组”,数组大小是变量的情况,应该用 vector

一定要使用变量作数组长度的话,换 C 语言 (C99) 吧
vsomeone
2024 年 3 月 21 日
根据你给的附言,推测可能是你 qtglobal 头文件引入的有问题,导致 qint64 被认为是 int32_t 。因为 2701131776 > INT_MAX(1 << 32 - 1),这个值在 assign 给 int32_t dataSize 之后被认为是一个负数,导致 bad_alloc 。
vsomeone
2024 年 3 月 21 日
@amorphobia 他这个不是变长数组呀,用了 new 分配在堆上的,变长数组指的是分配在栈上的
nagisaushio
2024 年 3 月 21 日
这么大文件为什么不 mmap?
MrKrabs
2024 年 3 月 21 日
2.51G 就大了?你们用的都是黄金内存吗
amorphobia
2024 年 3 月 21 日
@vsomeone 是我想错了
march1993
2024 年 3 月 21 日
一个动态申请的,一个是放在静态区的?
JustdoitSoso
2024 年 3 月 21 日
@vsomeone 感觉你说的是最有可能得情况,人家来请教问题,一群没分析没讨论的在说变量命名。
yuruizhe
2024 年 3 月 21 日
试试用
constexpr qint64 dataSize = 2701131776;
行不行?
NEO17
2024 年 3 月 21 日
看了这段代码,不建议再写 C++ :)
litguy
2024 年 3 月 21 日
这个不是应该 mmap 的方式访问么 ?
araraloren
2024 年 3 月 21 日
Why you need load whole data to memory?
ltyj2003
2024 年 3 月 21 日
动态长度用 vector
或者定义一个 char* ,然后 malloc 分配内存空间。

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

https://v2ex.xtra.eu.org/t/1025635

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

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

© 2021 V2EX