Я пытаюсь понять, как PyTables управляет данными, размер которых больше размера памяти. Вот комментарий в коде PyTables (ссылка на GitHub ):
# Nodes referenced by a variable are kept in `_aliveNodes`.
# When they are no longer referenced, they move themselves
# to `_deadNodes`, where they are kept until they are referenced again
# or they are preempted from it by other unreferenced nodes.
Также полезные комментарии можно найти внутри метода _getNode.< br> Кажется, что PyTables имеют очень умную систему буферизации ввода-вывода, которая, как я понимаю, хранит данные, на которые ссылается пользователь, в быстрой оперативной памяти как «живые узлы», сохраняет ранее упомянутые и в настоящее время неиспользуемые данные как «мертвые узлы» для быстрого «оживления» их при необходимости. и считывает данные с диска, если запрошенный ключ отсутствует ни в мертвых, ни в живых категориях.
Мне нужны некоторые знания о том, как именно PyTables обрабатывают ситуации при работе с данными, превышающими доступную память. Мои конкретные вопросы:
- Как работает система deadNode/aliveNode (общая картина)?
- В чем ключевая разница между живыми узлами и мертвыми узлами, хотя они оба представляют данные, хранящиеся в оперативной памяти, если я прав?
- Можно ли вручную настроить лимит оперативной памяти для буферизации? Под комментарием есть код, который считывает значение из
params['NODE_CACHE_SLOTS']
. Может ли это быть как-то указано пользователем? Например, если я хочу оставить немного оперативной памяти для других приложений, которым тоже нужна память? - В каких ситуациях PyTables может дать сбой или значительно замедлиться при работе с большим объемом данных? В моем случае может превысить память в 100 раз, какие частые подводные камни в таких ситуациях?
- Какое использование PyTables в смысле размера, структуры данных, а также манипуляций с данными считается «правильным» для достижения наилучшей производительности?
- Документация рекомендует использовать
.flush()
после каждого базового.append()
цикла . Насколько длинным может быть этот цикл? Я выполняю небольшой тест, сравнивая SQLite и PyTables в том, как они справляются с созданием огромной таблицы с парами ключ-значение из больших файлов CSV. И когда я использую.flush()
реже в основном цикле, PyTables получает огромное ускорение. Итак, правильно ли.append()
относительно большие куски данных, а затем использовать.flush()
?