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

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

c++,牛 我反正是没搞懂
SmartTom
2024-03-21 10:54:56 +08:00
@yolee599 是头疼,等一次采集任务结束,还要处理 50GB 的数据,哎~
iold
2024-03-21 10:58:34 +08:00
@SmartTom #24 试试使用文档中提供的宏呢?
Geekerstar
2024-03-21 11:16:39 +08:00
我还以为是 yushengjun (余胜军)
amorphobia
2024-03-21 12:08:42 +08:00
@SmartTom

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

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

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

https://ex.noerr.eu.org/t/1025635

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

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

© 2021 V2EX