Исходя из того, что я понимаю в вашем коде, вы пытаетесь найти каждое слово в словаре в списке документов.
Следовательно, вы делаете N * M сравнений, где N - количество слов (в словаре с целыми числами), а M - количество документов в списке документов. Используя ваши значения, вы пытаетесь вычислить 10 ^ 6 * 5 * 10 ^ 5 сравнений, что составляет 5 * 10 ^ 11. Неосуществимым.
Почему бы не создать изменяемую карту со всеми целыми числами в словаре в качестве ключей (1000000 дюймов в памяти - примерно 3,8 млн. От моих измерений) и пройти список документов только один раз, где для каждого документа вы извлекаете целые числа и увеличиваете их соответствующие значения на карте (для которых целое число является ключевым).
Примерно так:
import collection.mutable.Map
import scala.util.Random._
val maxValue = 1000000
val documents = collection.mutable.Map[String,List[(Int,Int)]]()
// util function just to insert fake input; disregard
def provideRandom(key:String) ={ (1 to nextInt(4)).foreach(_ => documents.put(key,(nextInt(maxValue),nextInt(maxValue)) :: documents.getOrElse(key,Nil)))}
// inserting fake documents into our fake Document map
(1 to 500000).foreach(_ => {val key = nextString(5); provideRandom(key)})
// word count map
val wCount = collection.mutable.Map[Int,Int]()
// Counting the numbers and incrementing them in the map
documents.foreach(doc => doc._2.foreach(k => wCount.put(k._1, (wCount.getOrElse(k._1,0)+1))))
scala> wCount
res5: scala.collection.mutable.Map[Int,Int] = Map(188858 -> 1, 178569 -> 2, 437576 -> 2, 660074 -> 2, 271888 -> 2, 721076 -> 1, 577416 -> 1, 77760 -> 2, 67471 -> 1, 804106 -> 2, 185283 -> 1, 41623 -> 1, 943946 -> 1, 778258 -> 2...
в результате получается карта, ключами которой являются число в dict, а значением - количество раз, которое она появляется в списке документов
Это упрощено с
- Я не проверяю, существует ли число в словаре, хотя вам нужно только инициировать карту со значениями, а затем увеличивать значение в окончательной карте, если у него есть этот ключ;
- Я не делаю IO, что ускоряет все это
Таким образом, вы проходите документы только один раз, что делает задачу снова выполнимой.