【发布时间】:2011-08-29 03:15:02
【问题描述】:
下午好,我们正在构建重复数据删除器的原型。我们使用 STL 字符串数组来存储要删除的记录。数组如下所示:
std::string* StringArray = new std::string[NumberDedupeRecords]
记录非常大,高达 160,000,000 字节。当我们尝试将记录的std::string 版本存储到std::string* StringArray 中以进行重复数据删除时,STL 对字符串进行深拷贝并分配至少160,000,000 字节的新缓冲区。我们很快耗尽了堆内存并得到了std::bad_alloc exception。是否有避免深拷贝和std::bad_alloc 的解决方法?也许我们应该使用一种新的数据结构来存储要删除的std::string 记录,或者我们应该保存auto_ptr 的记录。
我们在这里展示一个代码sn-p:
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;
谢谢。
【问题讨论】:
-
您能否发布代码 sn-ps,说明您如何将记录存储到 StringArray?
-
“dedupe”和“depupe”是什么意思?
-
This 可能会有所帮助。
-
@user258808,感谢您的回复。这是一些代码: 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
::iterator miter5 = range_type.lower_bound(Range(n)); (*miter5).mPtr = curr.mPtr; StringArrayCount += 1; -
@Frank 评论不适用于代码;改为编辑您的问题。