2013-12-03 3 views
0

Я пишу программу в mapreduce. Мне нужно сохранить большое значение для каждого ключа. Подробно для каждого id (key), я хочу сохранить значение, состоящее из больших чисел. Я использовал цифры от 1 до 100000000. Например:Какая структура данных используется в больших значениях?

id  value 
1  1,3,9,23,56,345,.......,10000000000 
2  6,8,45,321,876,.........,98760000876 
. 
. 
. 
100000000 1,2,6.83,90,126,567,.......,7632786765643 

На каждой итерации количество чисел в каждом значении увеличивается. Во-первых, я выбираю Text type для значения, но в результатах я увидел, что размер тасования стал очень большим, и я не мог получить ответ. Затем я выбрал BitSet Тип, но процесс BitSet был очень медленным. Я не знаю, какую структуру данных я могу использовать, которая может предоставить мне размер и скорость процесса. Может ли кто-нибудь помочь? Спасибо.

+1

Вы можете использовать [BigInteger] (http://docs.oracle.com/javase/6 /docs/api/java/math/BigInteger.html) – AurA

+0

@AurA: Cn BigInteger сэкономить много цифр? для каждого номера, сколько места ему нужно? Это быстро? –

ответ

1

Я думаю, что вы можете связать List для каждого ключа. Таким образом, вы можете использовать Map, который связывает идентификатор с перечнем чисел: Map<Integer, List<Long>>

+0

Какой из них лучше? Массив длин или список длин? –

+0

Использование массива в Java - плохая идея. Вместо этого вы можете использовать 'ArrayList' (произвольный доступ в O (1)). Но если вы хотите сохранить порядок в своих номерах, используйте вместо этого «LinkedList». – Patrick

+0

лучше или лучше? –

0

В Java тип данных int представляет собой 32-разрядное целое число со знаком. Он имеет диапазон от -2,147,483,648 до 2,147,483,647, чего недостаточно в вашем случае. Если у вас 64-разрядная машина, вы можете использовать тип «int».

В противном случае, вы можете использовать BigInteger

для меня подходящая структура данных является:

Map<Integer, List<BigInteger>> 
+0

Является ли biginteger лучше, чем битрейт? это быстро? –

+0

Регулярные операции над BigInteger (add, substract, multiply, divide), конечно, медленнее, чем соответствующие базовые типы, из-за большого размера, который он использует в памяти. BigInteger также неизменяемы. Таким образом, каждая операция создаст новый экземпляр, который является дорогостоящим в отношении количества операций, которые вы должны выполнить. – Lahniep

+0

Из-за размера чисел, которые вы хотите манипулировать, я рассмотрю переход от 32-битной к 64-битной машине, где вы можете просто использовать 'int' для представления чисел от -9223372036854775808 до 9223372036854775807. – Lahniep

Смежные вопросы