在c++程序中出现错误信息
Error message while in C++ program
我在以下地图中存储了大约14GB的数据:
struct data
{
char* a;
char* b;
data(char* _a, char* _b)
{
int alen = strlen(a);
a = new char[alen+1];
strcpy(a,_a);
a[alen]=' ';
int blen = strlen(_b);
b = new char[ blen+1];
strcpy(b,_b);
b[blen]=' ';
}
~data()
{
delete [] a;
delete [] b;
}
};
struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
map<const char*, data*, ltstr> m;
程序运行一定数量的记录(26293289中的10440440),一段时间后,我得到以下错误消息。
Program terminated with signal SIGKILL, Killed.
The program no longer exists.
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.25.el6.x86_64 libgcc- 4.4.5-6.el6.x86_64 libstdc++-4.4.5-6.el6.x86_64
如何避免上述终止?
服务器规格: Mem: 24605344k total, 15148556k used, 9456788k free, 20892k buffers
Swap: 2097144k total, 161364k used, 1935780k free, 14469244k cached
OOM杀手可能会介入并扼杀您的流程。看看你的日志就知道了。
如何避免上述终止?
重新思考你的设计。你想要完成什么?特别是,为什么需要一个内存中有2700万个条目的查找表呢?
在不了解程序的更多细节的情况下,您可以尝试对文件进行内存映射以减少内存使用
由于内存明显不足,因此要做的显然是减少正在使用的内存量。一种可能性是使用类似Patricia树的东西来存储数据,而不是使用std::map
(通常使用红黑树)。
将获得多少将取决于您的字符串中有多少冗余。在某种程度上,它还取决于你用作键的字符串的大小,而不是你用它们存储的数据的大小。
根据不同的情况,你也可以考虑使用像霍夫曼压缩这样的东西,用一个固定的表来存储与每个键相关的数据的字符串。虽然霍夫曼压缩在其他情况下不一定是最有效的,但是对于一个固定的表,它的优点是可以很好地处理单个字符串,就像您在这里处理的一样。如果data
部分的字符串很长(例如,两个字符串的平均长度至少为8K),那么除了霍夫曼压缩之外,应用LZ*族压缩可能是值得的,但如果它们很短(例如,任何少于至少几千字节的东西),LZ可能不会很好地工作(除非你愿意将字符串组合成块)。因此,在任何给定的时间,当你检索一些数据时,你可能需要解压缩几千字节的其他字符串来获得你关心的字符串。
虽然压缩通常比直接从内存访问数据而不压缩/解压缩要慢,但它通常比从磁盘检索数据要快,因为如果您耗尽了物理内存并最终使用虚拟内存,通常会发生这种情况。
- 提升异常的错误信息
- 我可以复制构造一个带有错误信息的提升::异常吗?
- androidndk和eclipse给出了关于c++getline()函数的不同错误信息
- 如何从lex / yacc获取更多解析错误信息
- Lua+Luabind,"runtime error"后堆栈顶部没有错误信息
- 如何使用Boost获取SyntaxError、NameError等的Python错误信息
- 用户输入数字的错误信息/向量
- 如何在MSBuild中定制c++编译器错误信息
- 程序崩溃,没有错误信息
- 在正确嵌套错误信息时遇到麻烦
- 错误信息c++
- 改进了dll丢失错误信息
- 关于隐式删除虚析构函数的错误信息是什么?
- 如何在c++中解释以下错误信息
- 如何解释显示在控制台上的c++错误信息
- 在我用c++编写的程序中显示错误信息
- visual studio中错误信息后面的消息是什么意思?
- c++汽车仪表模拟器.我一直收到这些错误信息
- Xcode 3.2断点错误信息
- 分割错误(core dumps) c++代码编译时的错误信息