"""Bounded-memory synthetic 500,000-draft snapshot benchmark, no external services.""" from pathlib import Path import sys, time, json, tempfile, tracemalloc sys.path.insert(0, str(Path(__file__).resolve().parents[2]/'wechat_rpa')) from test_knowledge_review import FullReviewTest from knowledge_review import KnowledgeReviewStore, KnowledgeReviewWorker fixture = FullReviewTest(); fixture.setUp() try: seed = fixture.seed(1)[0] started = time.monotonic() with fixture.db.connect() as db: # SQL generates the fixture; no Python array of all knowledge items. db.execute('''WITH RECURSIVE n(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM n WHERE i<499999) INSERT INTO knowledge_item(id,tenant_id,job_id,dedup_hash,title,question,answer,conditions, category,kind,flags_json,status,revision,valid_until,created_at,updated_at) SELECT printf('bench-%06d',n.i),k.tenant_id,k.job_id,printf('bench-%06d',n.i),k.title,k.question, k.answer,k.conditions,k.category,k.kind,k.flags_json,k.status,k.revision,k.valid_until,k.created_at,k.updated_at FROM n CROSS JOIN knowledge_item k WHERE k.id=?''', (seed,)) db.execute('''INSERT INTO knowledge_source SELECT k.id,s.message_id,s.version_no,s.role,s.content,s.sent_at FROM knowledge_item k CROSS JOIN knowledge_source s WHERE k.id!=? AND s.item_id=?''', (seed,seed)) seeding = time.monotonic()-started tracemalloc.start() reviews = KnowledgeReviewStore(fixture.store) started = time.monotonic(); job = reviews.preview('*', -1, fixture.actor, '') preview_seconds = time.monotonic()-started assert job['total'] == job['preview']['eligible'] == 500000, job reviews.action(job['id'], 'start', fixture.actor, '', True) worker = KnowledgeReviewWorker(fixture.store) started = time.monotonic() for _ in range(10): worker.step() batch_seconds = (time.monotonic()-started)/10 final = reviews.get(job['id'], fixture.actor) assert final['approved'] == final['processed'] == 1000 and final['status']=='running' assert fixture.store.stats('default') == {'approved':1000,'draft':499000} result = {'synthetic_drafts':500000,'seeding_seconds':round(seeding,3), 'preview_seconds':round(preview_seconds,3),'average_100_item_batch_seconds':round(batch_seconds,3), 'processed':final['processed'],'python_peak_mb':round(tracemalloc.get_traced_memory()[1]/1024**2,3), 'preview_response_bytes':len(json.dumps(job).encode()),'published':0} tracemalloc.stop() (Path(__file__).parent/'benchmark.json').write_text(json.dumps(result,indent=2),encoding='utf-8') print(json.dumps(result),flush=True) finally: fixture.tearDown()