Доступ к большим наборам данных и / или их хранение - PullRequest
1 голос
/ 16 февраля 2012

В данный момент я имею дело с большим количеством наборов данных с плавающей запятой / двойных данных, которые будут использоваться для расчета. У меня есть набор файлов для сравнения данных A с данными B, и я хотел бы вычислить евклидово подобие расстояния / косинуса. И.Е. Данные Точка 1 перебирает точки данных Б, чтобы найти ближайшего соседа.

Данные приведены в текстовом файле - никаких проблем с этим. Что было бы идеальным способом хранения / чтения информации?

Я должен был бы повторить Данные B для всех точек в Данные A. Данные должны быть сохранены как числа с плавающей запятой. Каждая точка данных может иметь измерения. Файл может содержать до 2 миллионов поплавков.

Должен ли я использовать:

  1. Постоянное чтение файла данных B и анализ строки (я чувствую, что это крайне неэффективно)
  2. Хранение данных в списке (массив с плавающей точкой)
  3. Использование ввода-вывода Memory-Map?
  4. HashMap (я относительно новичок в HashMap, они говорят, что позиции коллекции могут меняться со временем, если я просто перебираю без изменений, позиции изменятся?)

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

2M float - это не так уж и много, будет очень хорошо поместить их всех в список. Один список для A, один для B. Если A и B многомерны, float [] [] просто отлично. Если вы обнаружите, что вам не хватает памяти, попробуйте сначала загрузить всю B, но только одну точку данных из A за раз.

1 голос
/ 16 февраля 2012

Базовое решение является лучшим: просто float[][]. Это почти наверняка самое эффективное с точки зрения памяти и самое быстрое решение, и очень простое.

...