Можно ли сделать мелкую копию очень больших строк STL? - PullRequest
1 голос
/ 19 мая 2011

Добрый день, Мы строим прототип дедупера. Мы используем массив строк 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.

Здесь показан фрагмент кода:

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;

Спасибо.

Ответы [ 3 ]

5 голосов
/ 19 мая 2011

Вы можете просто взять указатель или ссылку на оригинал std::string - включая умный указатель, если вы считаете необходимым применять различные стратегии владения.

2 голосов
/ 19 мая 2011

Если возможно, вместо того, чтобы пытаться использовать умные указатели, вы можете изменить свой код так, чтобы у вас было только несколько экземпляров std::string в памяти одновременно.Это, конечно, будет зависеть от ваших шаблонов доступа, но вы можете загружать и обрабатывать по одной строке (записи) за раз, вместо того, чтобы выделять массив для всех них одновременно.

РЕДАКТИРОВАТЬ: Учитывая, что ОП пытается удалить дубликаты, это может работать не очень хорошо.

1 голос
/ 19 мая 2011

Я думаю, что реальный ответ на вашу проблему - использовать веревку - см. http://www.sgi.com/tech/stl/Rope.html - std :: string не предназначен для использования с очень большими строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...