Я ищу способы уменьшить потребление памяти SQLite3 в моем приложении.
При каждом выполнении он создает таблицу со следующей схемой:
(main TEXT NOT NULL PRIMARY KEY UNIQUE, count INTEGER DEFAULT 0)
После этого база данных заполняется 50к операций в секунду. Пишите только.
Когда элемент уже существует, он обновляет «счетчик» с помощью запроса на обновление (кажется, это называется UPSERT). Это мои запросы:
INSERT OR IGNORE INTO table (main) VALUES (@SEQ);
UPDATE tables SET count=count+1 WHERE main = @SEQ;
Таким образом, с 5 миллионами операций на транзакцию я могу очень быстро записывать в БД.
Меня не очень волнует дисковое пространство для этой проблемы, но у меня очень ограниченное пространство ОЗУ. Таким образом, я не могу тратить слишком много памяти.
sqlite3_user_memory() сообщает, что во время выполнения его потребление памяти увеличивается почти до 3 ГБ. Если я ограничу его до 2 ГБ с помощью sqlite3_soft_heap_limit64(), производительность операций с базой данных упадет почти до нуля при достижении 2 ГБ.
Мне пришлось увеличить размер кеша до 1M (размер страницы по умолчанию), чтобы достичь желаемой производительности.
Что я могу сделать, чтобы уменьшить потребление памяти?