Что такое эффективный для памяти способ преобразования карты Scala, в которой ключи - это индексы для эффективного размещения в массиве? - PullRequest
0 голосов
/ 09 апреля 2019

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

Я хочу преобразовать это в массив Java (для использования с Spark).

Я использую:

def toArray[T](input: Map[Int, T]): Array[T] = (0 until scores.keys.max).map(i => input.get(i).orNull).toArray

Целью этого является использование в приложении Spark. T, который я использую, - это Spark Vector, который может быть огромным (например, десятки тысяч двойников, МБ данных). Я обеспокоен тем, что то, что я делаю, так это то, что я не слишком экономен в использовании памяти.

Есть ли более эффективный способ памяти?

1 Ответ

2 голосов
/ 10 апреля 2019

Я бы не классифицировал ваше решение как "glib". Из-за выделения значений Range из Int из-за некоторого переполнения памяти. Длина диапазона будет scores.keys.max, но, вероятно, это использование памяти будет ограничено выделением памяти для ваших T значений.

Если вы хотите избежать этого начального распределения, вы можете использовать Iterator:

Iterator
  .range(0, scores.keys.max)
  .map(i => input.get(i).orNull)
  .toArray

Это позволит избежать создания в памяти последовательности значений Int и вместо этого работать с каждым индексом ленивым образом.

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