处理非常大的字符串的选项

时间:2010-08-22 18:36:50

标签: c# graphics 3d

我有一个C#程序,它使用生产语法生成树木和花朵以及类似有机实体的3D模型(有关L-Systems的更多信息,请参阅wikipedia entry) - 当我生成一个大树叶子,我(预期)会在弦乐器中呈指数增长,如果我愿意的话,它将达到100的演出。(我希望)。

约束 - 我必须在C#中执行此操作(C ++) - C ++ / native方面正在忙于编译和渲染生成的相当大的几何体。

所以StringBuilder是正确的 - 即使它可以处理它,我也没有足够的内存!

我不想做一个纯文件解决方案 - waaaaaayyyyyyyy toooooooooooo sloooooooooooowwww!

我无法改变语法 - 我意识到我可以压缩标准的L-Systems符号,但它是一个上下文敏感的语法,所以一旦你使用它,你就会变得非常迷信于摆弄它。

我考虑过的事情

内存映射文件 - 我不介意使用P / Invoke来获取本机层以支持事物,我只是不想用C ++重写整个生产系统 - 但是我没有在用于C#的方便库以访问此功能

关于内存管理/页面错误等的低级别问题 - 但是嘿,如果我这样做,我不如将其作为产品出售 - 使得基于缓慢纯文件的解决方案看起来不是一个坏主意

有人在这里有任何想法吗?如何有效地遍历/操作/扩展由生产语法生成的多字符串?

3 个答案:

答案 0 :(得分:4)

如果您可以升级到.net 4.0,那么您可以使用内存映射文件而无需P / Invoke。

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

答案 1 :(得分:1)

对于压缩的典型方法涉及预先存在的明文的概念,你是对的。我在这里谈论的是类似于使用trie data structure而不是字典的想法。它不仅仅是关于被动压缩,而是使用固有的更紧凑的表示,隐式地编码冗余。如果你现在处于100G大关,那么你的价格已超过了价格合理的硬盘限制,所以你可能会从重新思考解决方案中受益。

答案 2 :(得分:0)

如果这仅适用于您的开发机器,那么“回到未来”解决方案可能是RAM Disk,即RAM驱动器。

  

RAM磁盘或RAM驱动器是一块RAM(主存储器或易失性存储器),计算机软件正在将其视为内存是磁盘驱动器(辅助存储器)。

例如一个product。搜索RAM磁盘或RAM驱动器,您将获得丰富的选择。