Эволюция: в базу только улучшения лучших + счётчики по всем; выборка 10000
По требованию пользователя «не сохранять всё подряд, а только то, что нужно для эволюции»: рядовые геномы поколения больше НЕ пишутся строками в runs — писатель получает лёгкие StatsOnly-инкременты (счётчики, гистограмма, причины отказов на дашборде остаются честными по ВСЕМ оценкам), а полная строка пишется только когда лучший геном острова улучшился (+ полировка). Вставка миллионов строк в HDD-базу с 6 индексами была узким местом конвейера: GPU считал цикл ~23 мин, дозапись хвоста очереди шла часами (~150 строк/с), реальная скорость была ~165 оценок/с вместо ~1300/с. gpu_record_worker стал не нужен — удалён. Выборка эволюции уменьшена до 10000 на поколение (8 островов x 1250, было 8x4000=32000) — по просьбе пользователя, чтобы поколения сменялись быстрее; поколений за цикл теперь 120 (было 60) — при освобождённом писателе цикл углубляется вдвое дальше за то же время.
This commit is contained in:
@@ -99,6 +99,36 @@ def test_writer_survives_duplicate_run_id_and_keeps_draining_queue(tmp_path):
|
||||
conn.close()
|
||||
|
||||
|
||||
def test_writer_stats_only_bumps_counters_without_rows(tmp_path):
|
||||
"""StatsOnly-сообщения (эволюция шлёт их для рядовых геномов): агрегаты
|
||||
дашборда растут, а строк в runs не появляется."""
|
||||
from gausse.storage.database import StatsOnly
|
||||
|
||||
db_path = tmp_path / "runs.sqlite3"
|
||||
ctx = multiprocessing.get_context("spawn")
|
||||
queue = ctx.Queue()
|
||||
|
||||
writer = ctx.Process(target=run_writer_process, args=(queue, db_path))
|
||||
writer.start()
|
||||
|
||||
queue.put(_record("best-one")) # одна полная строка
|
||||
queue.put(StatsOnly("evolve", True, 0.42, None))
|
||||
queue.put(StatsOnly("evolve", False, None, "датчик: сигнал ниже порога"))
|
||||
queue.put(StatsOnly("evolve", False, None, None))
|
||||
queue.put(None)
|
||||
writer.join(timeout=10)
|
||||
|
||||
assert not writer.is_alive()
|
||||
conn = open_connection(db_path)
|
||||
assert count_runs(conn) == 1 # строка только у полной записи
|
||||
counters = dict(conn.execute("SELECT key, value FROM stats_counters"))
|
||||
assert counters["total"] == 4 # но посчитаны все четыре
|
||||
assert counters["feasible"] == 2
|
||||
reasons = dict(conn.execute("SELECT reason, count FROM stats_reasons"))
|
||||
assert reasons.get("датчик") == 1
|
||||
conn.close()
|
||||
|
||||
|
||||
def _writer_worker(queue, worker_id, n):
|
||||
for i in range(n):
|
||||
queue.put(_record(f"proc-{worker_id}-run-{i}"))
|
||||
|
||||
Reference in New Issue
Block a user