c# - 在内存中保存大型可编辑文档的最佳方法

标签 c# algorithm data-structures string document

我需要在内存中保留文档的表示形式,并且正在寻找最有效的方法来执行此操作。

假设

  • 文档可以很大,最多 到 100MB。
  • 通常是文档 将保持不变 - (即我不 想预先做一些不必要的事情 处理)。
  • 变化通常会非常接近 文档中的彼此(即作为 用户类型)。
  • 应该可以快速应用更改(无需复制整个文档)
  • 更改将适用于 偏移量和新的/删除的文本(不像 行/列)。
  • 使用 C# 工作

当前的考虑

  • 将数据存储为字符串。易于 代码,快速设置,很慢 更新。
  • 行数组,编码相对容易,设置速度较慢(因为我们必须将字符串解析为行),更新速度较快(因为我们可以轻松插入删除行,但查找偏移量需要求和行长度)。<

对于这种事情必须有大量的标准算法(这不是一百万英里的磁盘分配和碎片化)。

谢谢你的想法。

最佳答案

我建议将文件分成 block 。所有 block 在加载时都具有相同的长度,但如果用户编辑此 block ,每个 block 的长度可能会改变。如果用户在前面插入一个字节,这将避免移动 100 兆字节的数据。

要管理 block ,只需将它们 - 连同每个 block 的偏移量 - 放入列表中。如果用户修改了一个 block 的长度,你必须只更新这个 block 之后的 block 的偏移量。要查找偏移量,您可以使用二进制搜索。

文件大小:100 MiB
block 大小: 16 kiB
block :6400

使用二进制搜索查找偏移量(最坏情况): 13 个步骤
修改 block (最坏情况):复制16384字节数据并更新6400个 block 偏移量
修改一个 block (一般情况):复制8192字节数据并更新3200个 block 偏移

16 kiB block 大小只是一个随机示例 - 您可以通过选择 block 大小来平衡操作成本,可能基于文件大小和操作概率。做一些简单的数学运算将得出最佳 block 大小。

加载会非常快,因为您加载固定大小的 block ,并且保存也应该表现良好,因为您将不得不写入几千个 block 而不是数百万行。您可以通过仅按需加载 block 来优化加载,您可以通过仅保存所有更改的 block (内容或偏移量)来优化保存。

最终实现也不会太难。您可以只使用 StringBuilder 类来表示一个 block 。但是对于长度与 block 大小相当或更大的非常长的行,此解决方案将无法很好地工作,因为您将不得不加载许多 block 并仅显示一小部分,其余部分位于窗口的左侧或右侧。我假设在这种情况下您将不得不使用二维分区模型。

关于c# - 在内存中保存大型可编辑文档的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/838712/

相关文章:

algorithm - 查找矩阵组的数量

javascript - 游戏空间数据结构

Java 单个 LinkedList 添加复杂度为 O(1)

java - 什么 Java 数据结构/解决方案最适合这些要求?

java - 在一个巨大的集合中找到两个字符串的所有串联

c++ - 二分匹配

c# - 我的 Teams 机器人如何启动新的 1 :1 chat with a known user

c# - 无法将土耳其语字符从文本文件读取到字符串数组

c# - OwinStartup 停止使用 IIS 启动(但仍在使用 IIS Express)

c# - Graphics.DrawImage缩放方法?