45 lines
2.7 KiB
Python
45 lines
2.7 KiB
Python
"""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()
|