Я пытаюсь понять, как 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.
Похоже, что PyTables имеет очень умную систему буферизации ввода-вывода, которая, как я понимаю, хранит данные, на которые ссылается пользователь в быстрой оперативной памяти в виде "живыхNodes", продолжает ссылаться на ранее и в настоящее время неопубликованные данные как "deadNodes" для быстрого "оживления", когда это необходимо, и считывает данные с диска, если запрошенный ключ отсутствует как в мертвых, так и в живых категориях.
Мне нужно знать, как именно PyTables справляется с ситуациями при работе с данными, большими, чем доступная память. Мои конкретные вопросы:
- Как работает система deadNode/aliveNode (общее изображение)?
- Какое ключевое различие между liveNodes/deadNodes, пока они оба представляют данные, хранящиеся в ОЗУ, если они правы?
- Можно ли ограничить RAM для буферизации вручную? Ниже комментария есть код, который считывает значение из
params['NODE_CACHE_SLOTS']
. Может ли это быть каким-то образом указано пользователем? Например, если я хочу оставить ОЗУ для других приложений, которые также нуждаются в памяти? - В каких ситуациях PyTables может сбой или значительное замедление при работе с большой суммой данных? В моем случае может превышать память в 100 раз, каковы распространенные ошибки в таких ситуациях?
- Какое использование PyTables в значении размера, структуры данных, а также манипуляции с данными, считающимися "правильными" для достижения наилучшей производительности?
- Документы предлагают использовать
.flush()
после каждого базового цикла.append()
. Как долго этот цикл может быть на самом деле? Я выполняю небольшой тест, сравнивая SQLite и PyTables в том, как они могут обрабатывать создание огромной таблицы с парами ключ-значение из больших CSV файлов. И когда я использую.flush()
, реже в основном цикле, PyTables получает огромное ускорение. Итак - правильно ли,.append()
относительно большие куски данных, а затем используйте.flush()
?