首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++查看数据列

C++查看数据列
EN

Stack Overflow用户
提问于 2012-02-15 00:48:54
回答 2查看 198关注 0票数 1

我有一个海量的数据文件,我不能把它全部加载到内存中去查看。如何对查找特定值的文件进行排序(它是纬度、经度、高度,并且我正在查找限定特定高度的两个高度值,我将对这两个值进行插值以查找特定的经纬点)?我可以使用"getline()“来读取每一行,但这不会让我查看两个值并将它们与我想要的特定值进行比较(据我所知)。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-02-15 01:06:55

  • 由于您的文件相对较小,因此您可以将文件拆分为4个250MB的文件,然后在这些文件中进行搜索。
  • 从文件中读取较小的块,然后在这些块中搜索值。这是线性时间。
  • 对文件进行排序。您可以通过读取小块并使用快速排序对每个块进行排序(它会在适当的位置进行排序)来轻松完成此操作。对块进行排序后,将其转储到磁盘。在对所有块进行排序并存储在磁盘上之后,开始从每个块中读取一些值,并将这些值保存在内存中(称为new_chunks),然后开始将这些值合并到一个更大的文件中。每当使用来自new_chunk的值并将其移动到较大的文件中时,缓存更多来自它们各自的原始块,现在是srted块。在此过程结束后,您应该有一个排序的文件。这改进了一些搜索,但你仍然需要进行线性搜索,将大的排序文件的一部分放到内存中,所以它也是线性时间。
  • 更好的方法是在你按照上面的步骤对文件进行排序之后,然后在内存中建立索引。将索引映射到文件/磁盘上的位置。通过这种方式,您可以缩短文件内的查找时间。

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-02-15 03:10:21

您是否正在尝试查找高度与目标值相交的两个连续行/行?在这种情况下,您可以只存储getline()迭代之间的先前高度。然后,在任何一行上,如果当前高度大于目标高度,并且前一行小于目标高度,或者反之亦然,那么您已经越过了目标高度,并输出您需要输出的任何内容(可能会保存上一行,以便您可以插入经度/纬度)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9280776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档