下午好,我们正在build立一个演绎者的原型。 我们正在使用一个STLstring数组来存储要处理的logging。 数组看起来像这样:
std::string* StringArray = new std::string[NumberDedupeRecords]
logging非常大,高达160,000,000字节。 当我们试图存储一个std::string
版本的logging在std::string* StringArray
进行重复时,STL会对该string进行深层复制,并且malloc会创build至less160,000,000个字节的新缓冲区。 我们很快耗尽堆内存,并得到一个std::bad_alloc exception
。 是否有避免深层复制和std::bad_alloc
的解决方法? 也许我们应该使用一个新的数据结构来存储要被重复的std::string
logging,或者我们应该保存auto_ptr
的。
我们在这里显示一个代码片段:
std::string clara5(curr.getPtr()); char* const maryptr = (curr.getPtr() + n - curr.low()); maryptr[54] = '\x0'; StringArray[StringArrayCount] = clara5; curr.mPtr = (char*)StringArray[StringArrayCount].c_str(); std::multiset<Range>::iterator miter5 = ranges_type.lower_bound(Range(n)); (*miter5).mPtr = curr.mPtr; StringArrayCount += 1;
谢谢。
我认为你的问题的真正答案是使用绳索 – 见http://www.sgi.com/tech/stl/Rope.html – std :: string不是真的被设计用于非常大的字符串。
你可以简单地拿一个指针或引用原来的std::string
– 包括智能指针,如果你发现有必要强制执行各种所有权策略。
如果可能的话,而不是试图使用智能指针,你可能想要改变你的代码,以便在内存中一次只有少量的std::string
实例。 这当然将取决于您的访问模式,但是您可能一次加载和处理一个字符串(记录),而不是一次为它们分配一个数组。
编辑:鉴于OP正试图删除重复,这可能不会工作得很好。