2012-02-16 49 views
1

目前我正在处理大量的float/double数据集以用于计算。我有一组文件来比较数据A和数据B,我想计算欧几里德距离/余弦相似度。 I.E.数据点1遍历数据B点以找到最近的邻居。访问大数据集和/或存储它们

数据在文本文件中给出 - 没有问题。什么是存储/读取信息的理想方式?

我将不得不为数据A中的所有点重复数据B.数据将作为浮点数存储。每个数据点可能有尺寸。一个文件最多可以包含约2mil的浮点数。

我应该去使用:

  1. 不断读取数据B的文件,并解析字符串(我觉得这是非常低效)
  2. 在列表存储的数据(float数组)
  3. 使用内存映射IO?
  4. 的HashMap(我是比较新的HashMap的,他们说,收集的位置可以随时间而改变,如果我只是没有修改迭代通过,将位置改变?)
+1

我不明白为什么一个简单的'float [] []'数组在这里不起作用。 – 2012-02-16 08:21:50

+0

你似乎在数学上比我好,所以只要尝试估计所需的内存,如果你将浮点数存储在一个数组中:浮点数是4个字节,并且你有2百万个浮点数。这使得800万字节:8 MB。花生要存储在内存中。即使数据结构需要更多内存,并且将每个浮点数需要的内存乘以10,它仍然只有80 MB。仍然是花生。 – 2012-02-16 08:26:07

+0

哦,我忘了补充说,数据集中的点可能会丢失,从而使集合不完整。因此,我必须 1)扫描文件以查找最大尺寸和类别 2)使用列表。 实际上,您认为哪些开销较小,在创建确认和定义的二维数组之前扫描文件一次或使用列表? – 2012-02-16 11:16:14

回答

1

2M浮点数没有那么多,将它们全部放在一个列表中将会非常好。一个用于A的列表,一个用于B.如果A和B是多维的,则float [] []就足够了。如果您发现内存不足,请尝试首先加载整个B,但一次加载A中的一个数据点。

+0

对不起,我遗漏了导致上述问题的其他信息,将不胜感激,如果你可以阐明它 – 2012-02-16 11:21:37

1

基本解决是最好的:只有float[][]。这几乎可以肯定是内存效率最高,速度最快的解决方案,而且非常简单。

+0

对不起,我遗漏了导致上述问题的其他信息,将不胜感激,如果你能指出它 – 2012-02-16 11:21:29