下午好,我们正在构建一个重复数据删除器的原型。我们使用一组STL字符串来存储要删除的记录。该数组如下所示:
std::string* StringArray = new std::string[NumberDedupeRecords]
记录非常大,大到160,000,000字节。当我们尝试存储要在std::string
中重复删除的记录的std::string* StringArray
版本时,STL会对字符串进行深层复制,而malloc则会创建一个至少160,000,000字节的新缓冲区。我们很快耗尽堆内存并获得std::bad_alloc exception
。是否有解决方法来避免深层复制和std::bad_alloc
?也许我们应该使用新的数据结构来存储要重复删除的std::string
记录,或者我们应该保存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;
谢谢。
答案 0 :(得分:5)
如果您认为有必要强制执行各种所有权策略,您可以简单地获取原始std::string
的指针或引用 - 包括智能指针。
答案 1 :(得分:2)
如果可能,您可能希望更改代码,而不是尝试使用智能指针,这样一次只能在内存中有几个std::string
实例。这当然取决于您的访问模式,但您可以一次加载和处理一个字符串(记录),而不是一次为所有这些字符串分配数组。
编辑:鉴于OP正在尝试删除重复项,这可能效果不佳。
答案 2 :(得分:1)
我认为你的问题的真正答案是使用一根绳子 - 请参阅http://www.sgi.com/tech/stl/Rope.html - std :: string实际上并不适用于非常大的字符串。