【问题标题】:Accessing large data sets and/or storing them访问大型数据集和/或存储它们
【发布时间】:2012-03-07 15:23:51
【问题描述】:

目前我正在处理大量用于计算的浮点/双精度数据集。我有一组文件来比较数据 A 和数据 B,我想计算欧几里德距离/余弦相似度。 IE。数据 A 点 1 迭代数据 B 点以找到最近的邻居。

数据以文本文件的形式提供 - 没有问题。存储/读取信息的理想方式是什么?

我必须对数据 A 中的所有点重复数据 B。数据将存储为浮点数。每个数据点可能有维度。一个文件最多可以包含大约 200 万个浮点数。

我应该继续使用吗:

  1. 不断读取Data B的文件并解析字符串(感觉这样效率极低)
  2. 将数据存储在列表中(浮点数组)
  3. 使用内存映射 IO?
  4. HashMap(我对HashMap比较陌生,他们说集合的位置可能会随着时间的推移而改变,如果我只是在没有修改的情况下迭代,位置会改变吗?)

【问题讨论】:

  • 我不明白为什么简单的float[][] 数组在这里不起作用。
  • 你的数学似乎比我好,所以如果你将浮点数存储在一个数组中,试着估计所需的内存:一个浮点数是 4 个字节,你有 200 万个。这产生了 800 万字节:8 MB。花生储存在记忆中。即使数据结构更需要内存,并且将每个浮点数所需的内存乘以 10,它仍然只有 80 MB。还是花生。
  • 哦,我忘了添加数据集中的点可能会丢失,从而使数据集不完整。因此,我要么必须 1) 扫描文件以找到最大尺寸和类别 2) 使用列表。实际上,您认为哪个开销更小,在创建确认和定义的二维数组之前扫描文件一次或使用列表?

标签: java dataset large-data-volumes


【解决方案1】:

2M 的浮点数根本不算多,将它们全部放在一个列表中就可以了。 A 一个列表,B 一个列表。如果 A 和 B 是多维的,float[][] 就可以了。如果您发现内存不足,请尝试先加载整个 B,但一次从 A 加载一个数据点。

【讨论】:

  • 抱歉,我遗漏了导致上述问题的其他信息,如果您能对此有所了解,将不胜感激
【解决方案2】:

基本的解决方案是最好的:只需一个float[][]。这几乎可以肯定是最节省内存和最快的解决方案,而且非常简单。

【讨论】:

  • 抱歉,我遗漏了导致上述问题的其他信息,如果您能对此有所了解,将不胜感激
猜你喜欢
  • 2011-05-26
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多