我有一个C#程序,它使用产生式语法来生成树木和花朵的3D模型以及类似的有机实体(参见wikipedia entry了解更多关于L系统的信息)-当我生成一棵带有叶子的大树时,我(意料之中)会得到字符串的指数增长,如果我允许它(我也想这样做),它会增长到100倍。
约束-我必须(某种)在C#中做到这一点-C++/本机端忙于编译和渲染生成的相当巨大的几何图形。
所以StringBuilder是正确的-即使它可以处理它,我也没有足够的内存!
我不想做一个纯粹的基于文件的解决方案--等等!
我不能改变语法-我意识到我可以压缩标准的L-Systems符号,但它是上下文敏感的语法,所以一旦你让它工作,你就会对摆弄它变得非常迷信。
我考虑过的事情
内存映射文件-我不介意使用P/Invoke进入本地层来支持一些东西,我只是不想用C++重写整个生产系统-但是我还没有找到太多方便的C#库来访问这个功能
低级处理内存管理/页面错误等问题--但是,如果我这样做了,我还不如把它作为一个产品来销售--这使得基于文件的缓慢纯解决方案看起来不是一个坏主意
有谁有什么想法吗?如何有效地遍历/操作/扩展由产生式语法生成的multigig字符串?
发布于 2010-08-24 20:39:16
您说得很对,压缩的典型方法涉及到预先存在的明文的概念。我在这里谈论的是类似于使用trie data structure而不是字典的想法。它不仅仅是被动压缩,而是使用一种内在的更紧凑的表示来隐式地编码冗余。如果你今天达到了100G,你就可以突破负担得起的硬盘的极限,所以你可能会从重新考虑解决方案中受益。
发布于 2010-08-23 02:42:23
如果你可以升级到Invoke 4.0,那么你就可以使用内存映射文件,而不需要P/ .net。
http://msdn.microsoft.com/en-us/library/dd997372.aspx
发布于 2010-08-23 03:26:40
如果这只适用于你的开发机器,那么“回到未来”的解决方案可能是,也就是内存驱动器。
RAM盘或
驱动器是一块随机存储器(主存储器或易失性存储器),计算机软件将其视为磁盘驱动器(辅助存储器)。
例如,一个。搜索RAM磁盘或RAM驱动器,您将获得丰富的选择。
https://stackoverflow.com/questions/3542783
复制相似问题