大型文本文件查看器是如何工作的?如何构建大型文本读取器
大型文本文件查看器是怎么工作的呢?
我猜测:
- 使用了线程来处理文件
- 文本框是逐行更新的
- 有效的内存管理被使用
这些猜测对吗?如果有人想自己开发一个,应该注意哪些事项和避免哪些错误呢?
我打算用数据网格(DataGrid)来实现,而不是文本框。
我对C++和Python比较熟悉,可能会使用QT/PyQT。
补充说明
我手上的文件通常在1.5到2GB之间。我想要编辑和查看这些文件。
2 个回答
4
在Kernighan和Plaugher的经典(有点老旧?)书籍《Pascal中的软件工具》中,他们讨论了一个版本的编辑器ed(1)的开发和设计选择,并提到:
“警告:
edit
是一个很大的程序(不包括translit
、find
和change
的部分;950行代码,比书中其他任何程序都大50%)。”
而且他们(字面意思上)甚至没有字符串类型可以使用。因为他们提到要编辑的文件可能存在于磁带上,而磁带不支持在中间随意写入,所以他们不得不在内存中保留行位置的索引,并使用一个临时文件来存储更改、删除和添加的内容,在执行“保存”命令时将所有内容合并在一起。他们和你一样,也担心内存限制了可编辑文件的大小。
这种方法的一般结构在GNU ed项目中得以保留,特别是在buffer.c
文件中。
6
我认为关键在于不要把整个文件都加载到内存中,而是使用一些方法,比如“seek”,只加载当前正在查看的部分(可能还会加载前后的一小部分,以便处理滚动的情况)。也许还可以使用内存映射缓冲区,不过我对这个没什么经验。
要明白,修改一个大文件(快速)和仅仅查看它是两回事。你可能需要把编辑周围的几GB数据复制到一个新文件里,这样可能会比较慢。