编辑大数据文件

标签 editing large-files

我即将开始一个项目,其中我可以预见有大文件(主要是平面文本文件,但到目前为止可能是 CSV、固定宽度、XML,...)需要编辑。我需要开发一些片段来在应用程序中进行此编辑。

在尝试确定一种无需加载整个数据即可处理编辑大量数据(可能达到 GB 范围)的好方法时,我发现 Audacity 能够很好地处理大文件。 Audacity 是开源的,所以我认为在这种情况下它会成为我的一个优秀的教学工具。然而,我开始在代码中绕圈子,现在我彻底困惑了。

我希望这个问题能得到两个结果:

  1. 这是在不加载整个文件的情况下处理此编辑的好方法。我考虑过在他们编辑数据时加载数据,按需缓存。

  2. Audacity 如何做到这一点的解释。

我正在使用 C# 和 .NET,但答案不需要与该环境耦合。

最佳答案

一些技巧可以使编辑变得更简单、更快。

  1. 对其进行索引以便更快地访问。当用户什么都不做时,浏览文件并创建索引,以便您可以快速找到文件中的特定位置(见下文)。
  2. 仅存储用户所做的更改。在用户保存之前不要尝试将它们直接应用到文件。
  3. 设置当用户跳转到某个点时读取到内存中的数据量的限制。最初读取一两个屏幕的数据,以便可以显示它,然后如果用户没有立即跳转到新位置,请读取当前位置之前的一点和之后的一点。

索引:

当用户想要跳转到第 X 行时间戳 T 时,您不希望浏览整个文件来计算换行符和字符。浏览数据并创建记录。比如说,每 50 行记录字节偏移量、字符数和行号。该数据可以存储在哈希表、树或只是有序列表中。然后,当用户在文件中跳转时,您可以找到最近的索引点并从那里读取,直到找到请求的点。该技术在使用 Unicode 时特别​​有用,因为每个字符的字节数可能会有所不同。如果文件太大,内存中无法容纳完整索引,您可能需要限制索引点并更宽地间隔它们,或者将索引存储在临时文件中。

编辑和更改大文件:

按照 Harvey 的建议——仅将更改存储在内存中(作为差异),然后在通过从输入到输出的流式传输保存时将它们应用到文件。树或有序列表可能会有所帮助,因此您可以在从输入写入输出时快速找到需要进行更改的下一个位置。

如果更改太大而无法装入内存,您可能需要在单独的临时文件中跟踪它们(可能与原始文件位于同一文件夹中)。您可以继续编写连续的更改列表,并将新的更改附加到此更改文件中。保存时,您将通读更改列表并创建要应用的最终更改列表,然后再删除临时文件。出于性能原因,避免重写更改日志文件可能会有所帮助;相反,只需附加到其末尾,并在执行保存时删除冗余或取消编辑。

有趣的事实:用于更改日志的相同结构可用于提供撤消/重做信息。

关于编辑大数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045856/

相关文章:

jquery - jqGrid:编辑时禁用表单字段

Vim、长行和滚动

javascript - HTML5 - 上传文件而不在客户端处理它

java - 向已经很大的类添加大量变量

unix - 注释掉 shell 脚本中的一组行

wpf - 如何在 DataGrid 中获得类似 excel 的行为?

linux - 如何从 Linux 中的一个非常大的文件中获取唯一行?

Python 随机存取文件

python - 在小块中创建非常大的 NUMPY 数组(PyTables 与 numpy.memmap)

php - 在 php 中编辑 odt 文档的库