c++ - C++ 无法处理大型布尔数组
问题描述
我正在编写一个函数,该函数需要我将文件转换为 0 和 1 的数组。我认为这是使用bool
数组最容易完成的。但是,对于大于 ~1MB 的文件,以下代码会失败并崩溃。我的机器有 8GB RAM,所以我看不出崩溃的原因。
string file_name;
cin >> file_name;
string text = read_file(file_name); //I have defined this function as returning a string containing the file's contents and it works fine when tested separately
int length = text.size();
bool bin_arr[8*length]; //to store 0s and 1s
初始化bin_arr
失败,程序直接退出。
我将处理大于 1GB 左右的文件。但是,我不知道为什么会这样。我对 C++ 相当陌生。
如果相关,我在 Windows 10 上,使用 GCC 版本 6.3.0。
解决方案
我正在编写一个函数,该函数需要我将文件转换为 0 和 1 的数组。我认为这是使用 bool 数组最容易完成的。
我不知道你为什么这么想,最简单的方法是将文件存储为字节,就像文件包含的那样。vector<bool>
这样做,例如,它不会像您的代码那样将每个位存储在单个字节中,因此内存效率提高了 8 倍。
要获得单个位,请使用上述方法vector<bool>
或使用常规位摆弄。请记住,b & (1 << bit_number)
如果在您的字节中设置了该位,则返回一个非零值。
我将处理大于 1GB 左右的文件。
然后不要将整个文件存储在内存中,而是将其分成小块进行流式传输。
但是,我不知道为什么会这样。
哦,这很容易。您正试图在堆栈上不必要地分配一个不必要的巨大数组,而不是在堆上。您的堆栈有非常严格的限制,默认情况下我相信 Windows 为 1MB。
推荐阅读
- css - 可以做不重叠的阴影吗?
- vba - 使用 VBA 的单元格交叉引用
- sql-server - 仅当所有动态参数值都匹配时才从表中选择
- prolog - 单例变量错误
- objective-c - 如何访问从另一个类的 nib 文件加载的 NSWindow 的实例属性?
- jquery - 如何使用用户选项隐藏 jQuery jTable 中的特定列?
- ruby-on-rails - NameError:使用带有 factory_bot_rails 的 minitest 的 UserTest 的未定义局部变量或方法“用户”
- amazon-web-services - Amazon S3,如何将 JSON 文件复制到另一个在更新原始文件时更新的存储桶?
- python - 使用关键字多次拼接字符串
- dynamics-crm - 如何取消删除 MSCRM 实体中的字段