【问题标题】:C++ Look through Columns of dataC++ 浏览数据列
【发布时间】:2012-02-14 16:48:54
【问题描述】:

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

谢谢。

【问题讨论】:

  • 一次存储两个值并检查它们是否有效?我将如何有效地做到这一点?
  • 我猜要绑定的值是提前知道的,其他两个不是?
  • 您是在问如何从字符串中解析出数值,以便进行比较?
  • 我可以很好地解析它们,我面临的问题是将高度列中的两个值与指定值(比如 10,000)进行比较,以便我可以在这两个值之间进行插值以获得 lat /lon 为 10,000。数据文件大小超过1GB,所以我无法将其加载到内存中然后搜索。
  • 问题不清楚,我在想你需要对一个大文件进行排序。

标签: c++ getline


【解决方案1】:
  • 由于您的文件比较小,您可以将文件拆分为 4 个 250MB 的文件并在其中进行搜索。

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

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

  • 更好的方法是在您按照上述步骤对文件进行排序之后,然后在内存中创建索引。将索引映射到文件/磁盘中的位置。这样,您可以改善文件中的寻道时间。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多