Варианты работы с очень очень большими строками - PullRequest
0 голосов
/ 22 августа 2010

У меня есть программа на C #, которая использует производственную грамматику для создания трехмерных моделей деревьев и цветов и аналогичных органических объектов (см. запись в Википедии для получения дополнительной информации о L-системах) - когда я генерирую Большое дерево с листьями, я (как и ожидалось) получаю экспоненциальный рост в струне, который бы увеличился до 100 концертов, если бы я позволил (и я бы этого хотел).

Ограничения - я должен сделать это (вроде) в C # - сторона C ++ / native занята компиляцией и рендерингом довольно огромной геометрии, которая получается.

Так что StringBuilder прямо сейчас - даже если бы он мог с этим справиться, мне не хватает памяти!

Я не хочу делать чисто файловое решение - waaaaaayyyyyyyy toooooooooooo sloooooooooooowwww!

Я не могу изменить грамматику - я понимаю, что могу сжать стандартную нотацию L-Systems, но это контекстно-зависимая грамматика, поэтому, как только она заработает, вы станете суеверно относиться к ней.

Вещи, которые я рассмотрел

Отображенные в память файлы - я не против использовать P / Invoke, чтобы добраться до нативного уровня для поддержки вещей, я просто не хочу переписывать всю производственную систему на C ++ - но я не нашел много в способ удобных библиотек для C # для доступа к этой функции

Низкоуровневое копание с управлением памятью / сбоем страниц и т. Д. - но, эй, если бы я сделал это, я мог бы также продать его как продукт - делает медленное решение на основе чистого файла не такой уж плохой идеей

У кого-нибудь есть идеи? Как эффективно перемещаться / манипулировать / расширять мультигигрические строки, созданные в производственной грамматике?

Ответы [ 3 ]

4 голосов
/ 22 августа 2010

Если вы можете обновить до .net 4.0, то вы можете использовать файлы с отображением в памяти без необходимости P / Invoke.

http://msdn.microsoft.com/en-us/library/dd997372.aspx

1 голос
/ 24 августа 2010

Вы совершенно правы, что типичный подход к сжатию включает в себя понятие уже существующего открытого текста.То, о чем я говорю здесь, - это нечто вроде идеи использования структуры данных trie в отличие от словаря.Это не просто пассивное сжатие, а скорее использование более компактного по своей природе представления, которое неявно кодирует избыточность.Если вы достигнете отметки 100G сегодня, вы на пороге превышения ограничений доступных жестких дисков, так что вы могли бы выиграть от переосмысления решения.

0 голосов
/ 22 августа 2010

Если это только для ваших машин разработки, то решением «назад в будущее» может быть RAM Disk , он же RAM Drive.

Диск ОЗУ или ОЗУ - это блок ОЗУ (первичное хранилище или энергозависимая память), который обрабатывается программным обеспечением компьютера так, как если бы это был дисковод (вторичное хранилище).

Один продукт , например. Ищите RAM-диск или RAM-диск, и вы получите выбор изобилия.

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