【发布时间】:2022-06-11 00:20:20
【问题描述】:
我需要阅读一些包含大量数据的文本文件,比如 4 个文件,每个文件大约 500MB。
每个文件包含几行,每行大约是这种格式:
id timestamp field1 field2 field3 field4
到目前为止,我的策略是解析每个文件并为每一行创建一个 QTreeWidgetItem,其中包含适当数量的字段来存储该行(这是因为在程序期间我想在 QTreeWidget 中显示其中的一些数据)并附加所有将这些项目添加到 QList。
这个QList是为程序的所有执行而存储的,这样数据总是可用的,我不需要再解析文件了。
我需要所有可用数据,因为每时每刻我都需要访问与特定时间戳间隔相关的数据。
但是,这种策略在资源方面似乎过于膨胀,因为我看到程序消耗了几 GB 的内存并最终崩溃。
如何更好地处理此类数据?
【问题讨论】:
-
首先您需要使用模型视图概念(QTreeView 而不是 QTreeWidget)。为数百万行创建小部件无法扩展。接下来,您可以将文件映射到内存中,并且只使用指向文件的指针(参见 unix 下的
mmap())。如果这还不够,那么您必须使用模型视图概念的功能根据需要填充模型,仅扫描当前可见的文件部分。 -
这个查看大量数据的问题在几十年前就通过在大量数据上创建视图并仅加载该视图来解决,并且永远不会尝试将整个数据加载到列表控件或类似控件中(对于 Windows,我相信它被称为“虚拟列表”控件)。同样作为一个例子,复杂的代码编辑器在打开大文件时能够做到这一点,天真的代码编辑器会尝试加载整个文件。
-
感谢您的 cmets。你能告诉我一些你在说什么的例子吗?
-
您需要操纵文件读取以仅加载您感兴趣的文件部分。您不需要一个巨大的 GUI 应用程序。只是一个简单的
main,一个非常大的文件,看看你是否可以将第 1 行到第 10 行读入一个向量,检查你读的行是否正常,清除向量,然后测试读取可能 60 - 80 行,等等。目标是解决问题——第一个问题是将现有文件的部分读入容器中。然后,您可以添加缓存以缓存已读取的文件的某些部分,以便可以立即将其加载到控件中,等等。
标签: c++ qt5 qtreewidget qlist