【问题标题】:Efficient in-line search and replace for large file大文件的高效在线搜索和替换
【发布时间】:2024-04-23 09:35:01
【问题描述】:

有一些标准工具可以做到这一点,但我需要一个简单的 GUI 来帮助一些用户(在 Windows 上)。他们将获得一个打开文件对话框并选择要处理的文件。

该文件将是一个 XML 文件。该文件将包含(在前几行中)需要删除或替换为空格的文本字符串(不管是哪个)。

问题是 XML 文件有几个 GB 大,但固定的搜索和替换字符串会出现在前 4k 左右。

覆盖搜索字符串并就地保存而不需要将全部内容读入内存或过度写入磁盘的最佳方法是什么?

【问题讨论】:

  • 关于实际的 S&R。有这方面的标准 API 吗?从头开始写一个似乎毫无意义。
  • LPTSTR StrStr(LPCTSTR lpFirst, LPCTSTR lpSrch);我想我会尝试这样做。完全不熟悉windows...

标签: search performance replace inline


【解决方案1】:

显然用空格替换,这样整个文件的大小不会改变是这里的最佳选择,否则您必须流式传输整个文件才能在磁盘上更新。

如果这是针对 Unix 环境,我会考虑使用 mmap() 将文件开头的适当部分映射到 RAM,然后就地编辑并完成。

This snippet 展示了如何使用 Win32 等效的 @987654322@ 函数。

【讨论】:

  • 谢谢。我猜 CFM() 函数只允许将部分文件映射到 RAM 中,而操作系统将处理其余部分。我会调查的。
【解决方案2】:

您可以轻松编写自己的工具。如果它是在一开始,那么任何蛮力方法都将起作用。继续扫描,直到找到为止。

但是,只有在不更改文件大小的情况下才能避免大量磁盘写入。如果您希望在中间某处删除或插入字节,则必须覆盖它们后面的所有内容。在您的情况下,这实际上是所有文件。所以你必须用空格替换它。只要你只是用另一个字节替换一个字节,就不会有任何开销。

【讨论】: