应该使用哪种数据结构从文本文件中读取和存储大约500万个条目

本文关键字:存储 读取 500万 文件 文本 数据结构 | 更新日期: 2023-09-27 18:06:11

我必须处理两个大约1 GB的文本文件,并比较文件中的数据。我应该使用哪种数据结构来存储数据?使用字典/哈希表比较如此庞大的记录会导致内存不足的异常。还是应该读取数据并将其存储在数据库中?

应该使用哪种数据结构从文本文件中读取和存储大约500万个条目

从根本上说,数据库最适合这种行为,它们被设计用来处理这么多数据,并且已经为这种情况投入了更多的优化工作,然后你可能能够做到。

您可以使用InProcess SQL,如SqlLite,甚至NoSql场景,如Raven或MongoDB作为替代方案。

。. NET Framework 4提供了内存映射文件的特性(呵呵,老好的win32 API提供了这样的特性,因为许多年),你可以在单独的段中映射文件的不同部分,并同时处理它们。

要使用内存映射文件,必须创建整个内存映射文件或其中的一部分。你也可以创建多个视图到内存映射文件的同一部分,因此创建并发内存。为了使两个视图保持并发,它们必须是从相同的内存映射文件创建的。

如果文件大于,则可能需要多个视图应用程序可用于内存的逻辑内存空间大小映射(32位计算机上的2gb)。

这是使用数据库的一个主要示例。根据您的结构,脚本将需要定义其布局以将值添加到数据库中。

如果您可以对记录中的某些属性进行排序,这些属性也用于您的比较,则可以使用归并排序对文件进行排序,并并行扫描它们,而无需将整个数据存储在主存中。

如果使用两个嵌套循环,检查第一个文件中的记录是否也存在于第二个文件中,复杂度为O(n^2)。但是,如果文件是排序的,则可以使用单个循环。此外,归并排序的复杂度为O(n log n),总体复杂度为O(n log n),优于O(n^2)。下面是c#中归并排序的一个实现。

如果记录被索引,我认为使用数据库可以达到相同的结果(在速度方面)。