Форум сайта python.su
py.user.nextБаза в памяти займет меньше места, чем словарь?
То, что словарь не поместится в памяти, можно обойти через реализацию словаря через таблицу в базе данных. Есть такая возможность в sqlite3 сделать базу данных прямо в памяти.
Офлайн
PooHЭто искусственное ограничение питона для словарей. Пишет о нехватке памяти не потому, что там памяти не хватило.
База в памяти займет меньше места, чем словарь?
>>> import pympler.asizeof >>> >>> dct = {k: k for k in range(1000000)} >>> >>> pympler.asizeof.asized(dct).format() '{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6....99997, 999998: 999998, 999999: 999999} size=41165872 flat=25165872' >>> >>> pympler.asizeof.asized(12345).format() '12345 size=16 flat=16' >>>
Отредактировано py.user.next (Июль 9, 2017 07:13:43)
Офлайн
py.user.nextО! Клевая либа. Дзенкую!
pympler
Офлайн
Спасибо всех за помощь.
Вариант с noSQL и со словарем мне очень понравился/
Скрипт работает. Все-таки 3 500 списков длиной от 7 тыс. до 100 тыс. элементов я так и не смог обработать, но 2 000 все-таки удалось и результат хороший.
Буду дальше разбираться.
Еще раз все спасибо.
Офлайн
artexciteЧерез оперативку не обработаешь, надо сохранять на диск все пары (число, количество вхождений). Оно только по скорости упадёт. Рассматриваем наихудший случай - это когда все числа во всех списках разные. При этом по памяти они займут 14Gb. А словарь всегда весь нужен, потому что одинаковые числа могут находиться на разных концах - в первом элементе первого списка и в последнем элементе последнего списка.
Все-таки 3 500 списков длиной от 7 тыс. до 100 тыс. элементов я так и не смог обработать,
Отредактировано py.user.next (Июль 11, 2017 02:33:15)
Офлайн
А чем все таки плох вариант с таблицей счетчиков? Зачем вводить лишние сущности без нужды
Офлайн
PooH
А чем все таки плох вариант с таблицей счетчиков?
PooH
А если такой вариант, схему данных оставляем как есть, добавляем таблицу <id элемента> - <счетчик вхождений>. Конечно это не нормальная форма, но раз схема и была денормализованной. Существующие данные, конечно, довольно долго будет обрабатывать, но зато вполне кусками, прочитали кусок таблицы, обновили счетчики. После вполне можно на триггеры повесить обновление таблицы со счетчиками.
Отредактировано py.user.next (Июль 11, 2017 08:16:23)
Офлайн
Я поставил MongoDB и все данные перенес в нее в том числе и мои огромные списки.
Коллекция содержит данные в json формате и соответственно данные будут храниться следующим образом:
{ _id: 1, item: [41234567, 5678909, 64563223, 74456785, 8456788] }
{ _id: 2, item: [65645656, 5765767, 645645645, 654645, 56456456] }
{ _id: 3, item: [86778678, 675676, 675675675, 76465546, 6544656] }
и т. д.
{ _id: 1, item: 1223232, count: 1 }
{ _id: 2, item: 1454644, count: 2 }
{ _id: 3, item: 1345452, count: 4 }
и т. д.
Отредактировано artexcite (Июль 11, 2017 09:07:56)
Офлайн