Как уменьшить использование памяти процессом, когда я конвертирую таблицу ets в список на Erlang? - PullRequest
0 голосов
/ 25 января 2019

У меня возникла серьезная проблема при попытке преобразовать таблицу ets в список с помощью ets: tab2list.

У меня 1500 элементов в таблице ets, и у большинства из них есть ключ со значением около 20К текстовых данных. Размер таблицы таблицы ets составляет около 30 МБ.

Но когда я пытаюсь преобразовать эту таблицу в список, это будет стоить около 400 МБ памяти процесса, и кажется, что использование памяти процессом связано с размером таблицы и элемента. Когда я пытаюсь преобразовать таблицу 200 МБ с 10000 элементов. Он тратит почти память моей ВМ в одну строку и делает мою программу закрытой ОС.

Есть ли другой хороший способ справиться с моим делом? Кажется, ETS не подходит для моего случая использования? или есть другой хороший способ преобразовать таблицу ets в список без большого потребления памяти?

Спасибо тебе ~~

Eric

пс: Я использую таблицу, чтобы поставить в очередь список команд команды redis, и сделаю пакетную вставку, чтобы повторить ее позже, чтобы избежать загруженной сетевой операции. Каждый элемент выглядит как

{index, {["set", "key"], "text"}

и мне нужна пакетная команда в виде

[["set", "key1", "text1"], ["set", "key2", "text2"]]

В моем случае текст документа составляет около 20000 слов

1 Ответ

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

Вы можете попытаться реализовать пакетный подход с помощью:

ets:select(Tab, MatchSpec, Limit) -> 
    {[Match], Continuation} | '$end_of_table'

или

ets:match(Tab, Pattern, Limit) ->
     {[Match], Continuation} | '$end_of_table'

, так что размер вашей партии равен Limit, и вы можете удалить записи de после успешного завершениявставить на Redis.

С уважением.

...