Если ваш файл имеет данные на несколько ГБ, я бы не стал хранить их в Dict
. Я думаю, что лучше обрабатывать файл последовательно и хранить ключи, которые соответствуют вашему условию, в PriorityQueue
из пакета DataStructures.jl
. Конечно, вы можете повторить ту же процедуру, если вы читаете данные из словаря в памяти (просто изменяется источник из файла на диске в словарь)
Вот псевдокод того, что вы могли бы рассмотреть (полное решение будет зависеть от того, как вы читаете свои данные, которые вы не указали).
Предположим, что вы хотите хранить элементы до тех пор, пока они не превысят пороговое значение, сохраняемое в константе THRESH
.
pq = PriorityQueue{String, Int}()
s = 0
while (there are more key-value pairs in source file)
key, value = read(source file)
# this check avoids adding a key-value pair for which we are sure that
# it is not interesting
if s <= THRESH || value > peek(pq)[2]
enqueue!(pq, key, value)
s += value
# if we added something to the queue we have to check
# if we should not drop smallest elements from it
while s - peek(pq)[2] > THRESH
s -= dequeue!(pq)[2]
end
end
end
После этого процесса pq
будет содержать только те пары ключ-значение, которые вас интересуют. Основное преимущество этого подхода заключается в том, что вам никогда не нужно хранить все данные в ОЗУ. В любой момент времени вы сохраняете только те пары ключ-значение, которые были бы выбраны на данном этапе обработки данных.
Обратите внимание, что этот процесс не дает легко предсказуемого результата, поскольку несколько ключей могут иметь одинаковое значение. И если это значение будет находиться на границе отсечения, вы не знаете, какие из них будут сохранены (однако вы не указали, что вы хотите сделать в этом особом случае - если вы указали бы требование для этого случая, алгоритм должен быть обновлен немного).