代码之家  ›  专栏  ›  技术社区  ›  Mark Mullin

处理非常大字符串的选项

  •  0
  • Mark Mullin  · 技术社区  · 14 年前

    我有一个C#程序,它使用生产语法生成树、花和类似有机实体的3D模型(参见 wikipedia entry 关于L系统的更多信息)-当我生成一棵有叶子的大树时,如果我愿意(我也愿意),我(预期)得到的字符串将以指数级增长,达到100的Gig。

    约束——我必须在C++中这样做(C++)——C++/本机端正在忙编译和渲染产生的相当庞大的几何图形。

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

    我不想做一个纯粹的基于文件的解决方案-waaaaaayyyyyyyyy tooooooooooooooooowwww!

    我不能改变语法-我意识到我可以压缩标准的L-Systems符号,但它是一个上下文敏感的语法,所以一旦你让它工作,你就会对摆弄它产生积极的迷信。

    我考虑过的事情

    内存映射文件-我不介意使用P/Unjk来支持本地层,我不想在C++中重写整个生产系统,但是我没有发现很多方便的C库访问这个功能的方法。

    在内存管理/页面错误等方面进行低级的混淆视听-但是,如果我这样做了,我还不如把它作为一个产品来销售-这使得缓慢的纯基于文件的解决方案看起来不是一个坏主意

    有人有什么想法吗?如何有效地遍历/操作/扩展由产生式语法生成的multigig字符串?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jordão    14 年前

    你说得很对,典型的压缩方法涉及到一个预先存在的纯文本的概念。我这里说的是使用 trie data structure 与字典相反。它不仅仅是被动压缩,而是使用一种固有的更紧凑的表示,隐式地对冗余进行编码。如果您现在的硬盘容量达到了100G,那么您就有可能突破负担得起的硬盘驱动器的限制,因此您可能会从重新考虑解决方案中获益。

        3
  •  0
  •   JustBoo    14 年前

    如果这只适用于您的开发机器,那么“回到未来”解决方案可能是一个不错的选择 RAM Disk ,又名RAM驱动器。

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

    一个 product