c – 提升序列化binary_oarchive崩溃

c – 提升序列化binary_oarchive崩溃,第1张

概述首先,我填充的是一个相当大且具有相互关系的结构.然后我将其序列化为二进制存档.该结构的大小取决于我向程序提供的数据.我看到该程序需要大约2GB的内存来构建预期和可接受的结构. 然后我开始序列化对象.我看到程序在序列化时吃了RAM. RAM使用率一直在增长,直到接近100%.交换使用率仍为0字节. 然后应用程序崩溃.新的bad_alloc除外 为什么序列化过程需要占用大量的RAM和时间?为什么在交换 首先,我填充的是一个相当大且具有相互关系的结构.然后我将其序列化为二进制存档.该结构的大小取决于我向程序提供的数据.我看到该程序需要大约2GB的内存来构建预期和可接受的结构.

然后我开始序列化对象.我看到程序在序列化时吃了RAM. RAM使用率一直在增长,直到接近100%.交换使用率仍为0字节.

然后应用程序崩溃.新的bad_alloc除外

为什么序列化过程需要占用大量的RAM和时间?为什么在交换为空时分配内存会崩溃?回溯太长,无法完全粘贴.

#0  0xb7fe1424 in __kernel_vsyscall ()#1  0xb7c6e941 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64#2  0xb7c71e42 in abort () at abort.c:92#3  0xb7e92055 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6#4  0xb7e8ff35 in ?? () from /usr/lib/libstdc++.so.6#5  0xb7e8ff72 in std::terminate() () from /usr/lib/libstdc++.so.6#6  0xb7e900e1 in __cxa_throw () from /usr/lib/libstdc++.so.6#7  0xb7e90677 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6#8  0xb7f00a9f in boost::archive::detail::basic_oarchive_impl::save_pointer(boost::archive::detail::basic_oarchive&,voID const*,boost::archive::detail::basic_pointer_oserializer const*) () from /usr/lib/libboost_serialization.so.1.42.0#9  0xb7effb42 in boost::archive::detail::basic_oarchive::save_pointer(voID const*,boost::archive::detail::basic_pointer_oserializer const*) () from /usr/lib/libboost_serialization.so.1.42.0#10 0x082d052c in voID boost::archive::detail::save_pointer_type<boost::archive::binary_oarchive>::non_polymorphic::save<gcl::nestedConnection<gcl::Section,gcl::nestedConnection<gcl::Paragraph,gcl::nestedConnection<gcl::line,voID> > > >(boost::archive::binary_oarchive&,gcl::nestedConnection<gcl::Section,voID> > >&) ()#11 0x082d0472 in voID boost::archive::detail::save_pointer_type<boost::archive::binary_oarchive>::save<gcl::nestedConnection<gcl::Section,voID> > > const&) ().......#172 0x082a91d8 in boost::archive::detail::interface_oarchive<boost::archive::binary_oarchive>::operator<< <gcl::Collation const> (this=0xbfffe500,t=...) at /usr/include/boost/archive/detail/interface_oarchive.hpp:64#173 0x082a6298 in boost::archive::detail::interface_oarchive<boost::archive::binary_oarchive>::operator&<gcl::Collation> (this=0xbfffe500,t=...) at /usr/include/boost/archive/detail/interface_oarchive.hpp:72#174 0x0829bd63 in main (argc=4,argv=0xbffff3f4) at /home/neel/projects/app/main.cpp:93

>程序正常工作当需要较小的数据时.
>使用linux 64位和32位PAE内核提升1.42
>程序在几个修订版之前没有崩溃的情况下工作.我最近在结构中添加了一些字节.可能那时它还没有到达RAM的末端,现在已达到目标.

但是,当有足够的掉期时,为什么新的崩溃呢?为什么序列化过程需要这么多内存?

解决方法 问题:当swap为空时,为什么在分配内存时会崩溃?

分配的对象太大,无法适应virtual address space中的任何位置:

>分配的对象是巨大的
> virtual address space太分散了
> virtual address space全部分配

如果您的应用程序被编译为32位,则过程virtual address space限制为4Gb.

问题:为什么序列化过程需要这么多内存?

我没有找到任何证据.

总结

以上是内存溢出为你收集整理的c – 提升序列化binary_oarchive崩溃全部内容,希望文章能够帮你解决c – 提升序列化binary_oarchive崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230417.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存