File size: 2,285 Bytes
3b3b2bd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from pathlib import Path
import sys,time,json,platform,statistics,random,os,math,resource,tempfile
ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT))
from phillnet_recall import RecallMemory,RecallPolicy

def main():
    rng=random.Random(781);policy=RecallPolicy();rows=[]
    for n in (1000,10000):
        with tempfile.TemporaryDirectory() as td:
            path=Path(td)/'scale.sqlite'
            with RecallMemory(path,policy=policy,clock=lambda:100000.,max_candidates=2048) as m:
                t=time.perf_counter()
                for i in range(n):m.remember(f'Unit{i:06} deployment service port is {10000+i}.',source=f'session:{i//10}',entity=f'Unit{i:06}',predicate='port',value=str(10000+i))
                ingest=time.perf_counter()-t;times=[];success=0;candidate_counts=[]
                for i in rng.sample(range(n),100):
                    t=time.perf_counter_ns();r=m.retrieve(f'Unit{i:06}',top_k=1);times.append((time.perf_counter_ns()-t)/1e6)
                    success+=bool(r['items'] and str(10000+i) in r['items'][0]['text']);candidate_counts.append(r['trace']['candidate_count'])
                overflow=m.retrieve('deployment service port',top_k=8)
                m.db.execute('PRAGMA wal_checkpoint(TRUNCATE)')
                rows.append({'entries':n,'ingest_seconds':ingest,'queries':100,'correct':success,'query_family':'unique identifier; favorable lexical selectivity',
                    'candidate_min':min(candidate_counts),'candidate_max':max(candidate_counts),'median_ms':statistics.median(times),'p95_ms':sorted(times)[94],
                    'generic_query_status':overflow['status'],'database_bytes':path.stat().st_size,'accounted_payload_bytes':m.stats()['accounted_payload_bytes']})
    result={'environment':{'python':sys.version,'platform':platform.platform(),'cpu_count':os.cpu_count(),'native':bool(policy.bank._lib),'max_rss_kib_linux':resource.getrusage(resource.RUSAGE_SELF).ru_maxrss},'rows':rows,'note':'Unreserved shared CPU, one process, 100 queries per size. No model-generation cost. Does not establish arbitrary-query latency or million-row scalability.'}
    (ROOT/'reports/scale.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2))
if __name__=='__main__':main()