Работа с большими объемами данных в Java: скорость - PullRequest
3 голосов
/ 25 января 2011

Я хочу работать с 10k-100k точками данных в виде 16-ти кортежей (x_1, ..., x_16).Большинство элементов кортежа являются числами с плавающей запятой в [0,1] вместе с одной строкой и несколькими целыми числами.

Я хочу иметь возможность выполнять молниеносные (предпочтительно <10 мс) математические операции в выбранных точкахданные.Например: вычислить среднее значение x_15 для всех точек, которые удовлетворяют: x_3 находится в [0.3,0.4] и x_5> x_2.

Мой наивный подход заключается в создании чего-то вроде создания класса для каждого кортежа, а затемделаю математику на занятиях.Для хранения я бы просто записал все кортежи в текстовый файл после завершения программы и загрузил их оттуда при запуске программы.

Возможно ли это и будет ли такой подход молниеносным?

Ответы [ 4 ]

2 голосов
/ 25 января 2011

Если вы хотите быстрое сканирование для каждого столбца, я рекомендую хранить каждый столбец отдельно.например, намного быстрее сканировать объект с плавающей точкой [], чем то же количество объектов, содержащих объект с плавающей точкой.(Ваш кеш предпочел бы его для начала)

Другой подход заключается в использовании индексированных данных, но вам необходимо определить, будет ли это быстрее для вас.

2 голосов
/ 25 января 2011

Вероятно, будет быстрее загружать кортежи в двумерный массив с плавающей точкой, а не в одномерный массив экземпляров классов, так как кажется, что вы захотите провести много сравнений между отдельными кортежами (поэтому чтобы получить доступ к свойствам класса 100k раз + за запрос, делая это способом массива 1d)

0 голосов
/ 25 января 2011

Math Speed ​​

Если значения с плавающей точкой являются значениями с фиксированной запятой, я полагаю, что вы получите прирост скорости, сохранив их как целые (или длинные) и манипулируя ими с помощью арифметических операций int. Например, вы можете представить значение 0,000001 как 1 и значение 0.123456 как 123456.

след памяти

Как упоминалось, по крайней мере, в одном другом ответе, когда вы загружаете свои значения, хранение их в массиве значений будет занимать меньший объем памяти, чем массив объектов-объектов (как минимум, на 1 ссылку меньше на каждый набор). Например:

public class MathTupple
{
    public MathTupple(int tuppleCount)
    {
        valueBlah = new long[tuppleCount];
    }

    private long[] valueBlah;
}
0 голосов
/ 25 января 2011

Для начала вам лучше использовать сильно проиндексированную базу данных. Затем вы можете многое сделать в запросах к базе данных, так что единственные данные, которые вам действительно нужно обработать, это данные, которые соответствуют вашим критериям. В противном случае скорость будет зависеть от порядка сортировки данных в файле и количества процессора и памяти, которые вы можете использовать для этого. Я подозреваю, что ввод-вывод и фильтрация данных, вероятно, будут большими убийцами времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...