C++浏览数据列

C++ Look through Columns of data

本文关键字:数据 浏览 C++      更新时间:2023-10-16

我有一个数据文件是MASSIVE,我无法将其全部加载到内存中进行查看。我如何对文件进行排序以查找特定值(它是纬度、经度、海拔高度,我正在查找绑定特定海拔高度的两个海拔值,我将在其中插值以查找特定的纬度/经度点)?我可以用"getline()"读取每一行,但这不允许我查看两个值并将它们与我想要的特定值进行比较(据我所知)。

谢谢。

  • 由于您的文件相对较小,您可以将文件拆分为4个250MB的文件并在其中进行搜索。

  • 从文件中读取小块,并在这些块中搜索值。这是线性时间。

  • 对文件进行排序。您可以通过读取小块并使用Quicksort对每个块进行排序(它在适当的位置进行排序)来轻松地做到这一点。对区块进行排序后,将其转储到磁盘。在所有块都被排序并在磁盘上之后,开始从每个块中读取一些值,并将它们保存在内存中(称为这些new_chunks),然后开始将这些值合并到一个更大的文件中。每当使用new_chunk中的值并将其移动到较大的文件中时,都要从它们各自的原始块(现在是srted块)中缓存更多的值。这个过程结束后,您应该有一个已排序的文件。这改进了一点搜索,但您仍然需要进行线性搜索,将大排序文件的部分内容放入内存,因此这也是线性时间。

  • 一个更好的方法是,按照上面的步骤对文件进行排序后,在内存中创建索引。将索引映射到文件中/磁盘上的位置。通过这种方式,您可以提高文件中的寻道时间。

    例如,如果你的文件有数字,比如1,2,3,。。。100.通过存储在内存中对文件进行索引(文件中的数字:文件中的位置/磁盘上的位置)1:0,10:9,20:19。。。现在,如果你在寻找数字18,你可以在这些索引(logn-time)中进行二进制搜索,发现18在10到20之间,所以你读取了位置9到19的文件,并将该块放入内存。现在在该区块中执行另一个二进制搜索:logm时间

    总运行时间:logn+logm或log(num_index_chunks)+log(avg_size_of_chunk)+chunk_i_load_time

您是否试图找到海拔与目标值相交的两条连续直线/行?在这种情况下,您可以只存储getline()迭代之间的先前高度。然后,在任何一行上,如果当前高度大于目标高度,而上一行低于目标高度,反之亦然,则表示您已越过目标高度,并输出您需要输出的任何内容(可能会保存上一行的全部内容,以便您可以内插纬度/经度)。