Ë
    ýØ£jº  ã                   ó  — d Z ddlZddlZddlZddlZdZdZdZdej                  v Z	dZ
ej                  D ]/  Zej                  d«      sŒ eej                  dd	«      d	   «      Z
Œ1 d
ZdZd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)u¸  å¢žé‡�é‡�å»º gov_bigram â€”â€” æ°´ä½�çº¿ç‰ˆï¼ˆ2026-09-11 æ›¿æ�¢ inc2ï¼‰

ä¸ºä»€ä¹ˆæ�¢æŽ‰ inc2ï¼š
  æ—§ inc2 ç”¨ `LEFT JOIN (SELECT DISTINCT rowid FROM gov_bigram) b ... WHERE b.rowid IS NULL`
    â‘  `SELECT DISTINCT rowid FROM gov_bigram` å…¨æ‰« 1.42 äº¿æ�¡ç´¢å¼•é¡¹ â€”â€” å®žæµ‹**ä»…"æŸ¥æ‰¾ç¼ºå¤±"å°± 82s**
       ï¼ˆå�³ä½¿ 0 æ�¡ç¼ºå¤±ä¹Ÿç…§è·‘ï¼‰
    â‘¡ ç»“æžœå†� `.fetchall()` å…¨éƒ¨è¯»è¿›å†…å­˜ â€”â€” ç”Ÿäº§æœºå�ªæœ‰ 1.75GB å†…å­˜ï¼Œæ•°æ�®é‡�ä¸€å¤§å°±æœ‰ OOM é£Žé™©

æ–°å†™æ³•ï¼ˆä¸¤å¤„å…³é”®ä¼˜åŒ–ï¼‰ï¼š
  â‘  **meta æ°´ä½�çº¿è¡¨** `index_watermark(name, value)`ï¼ŒO(1) è¯»ã€‚
     âš ï¸� ä¸�èƒ½ç›´æŽ¥ `SELECT MAX(rowid) FROM gov_bigram`ï¼šæœ¬è¡¨ `rowid` æ˜¯**æ˜¾å¼� INTEGER åˆ—**
     ï¼ˆè§� pragma_table_infoï¼‰ï¼Œæ²¡æœ‰ä»¥å®ƒæ‰“å¤´çš„ç´¢å¼• â†’ MAX() é€€åŒ–ä¸ºå…¨æ‰« 1.42 äº¿è¡Œï¼Œ
     å®žæµ‹ **38s**ï¼ˆæ¯�æ¬¡è¿�è¡Œéƒ½è¦�ä»˜ï¼Œå“ªæ€• 0 æ�¡æ–°æ•°æ�®ï¼‰ã€‚
     `MAX(_rowid_)` è™½ 0.003s ä½†é‚£æ˜¯æ�’å…¥åº�å�·ï¼Œ**ä¸�æ˜¯ doc id**ï¼Œä¸�å�¯ç”¨ã€‚
  â‘¡ å�ªå�– `gov_raw.id > æ°´ä½�çº¿` çš„è¡Œï¼Œkeyset åˆ†æ‰¹ 200 æ�¡æµ�å¼�å¤„ç�†ï¼Œ
     å³°å€¼å†…å­˜ = ä¸€ä¸ªæ‰¹æ¬¡çš„ 2-gramï¼ˆå‡ ç™¾ KBï¼‰ã€‚
  â‘¢ ä¸Ž inc2 å®Œå…¨å�Œå�£å¾„çš„ gram æ��å�–ï¼ˆè¿žç»­ä¸­æ–‡/æ•°å­—/å­—æ¯�æ®µå†…æ‰€æœ‰ 2-gramï¼‰
  â‘£ å´©æºƒå�Žé‡�è·‘å®‰å…¨ï¼šæŒ‰ id å�‡åº�å†™ï¼Œæ°´ä½�çº¿å�ªå‰�è¿›ï¼Œä¸�é‡�å¤�ä¸�æ¼�ã€‚

âš ï¸� å‰�æ��ï¼šå¢žé‡�å†™å…¥æŒ‰ id å�‡åº�ï¼ˆæœ¬è„šæœ¬è‡ªèº«ä¿�è¯� keyset ORDER BY idï¼‰ã€‚
   åŽ†å�²é�—ç•™çš„"æ°´ä½�çº¿ä»¥ä¸‹ç¼ºå¤±"ç”¨ --verify ä¸€æ¬¡æ€§å…¨æ‰«æ ¸å¯¹ï¼ˆå�ªè¯»ï¼‰ã€‚

ç”¨æ³•:
  python3 rebuild_bigram_inc2.py            # æ—¥å¸¸å¢žé‡�ï¼ˆcron + æ—¥è·‘æ”¶å°¾å�‡è°ƒç”¨ï¼‰
  python3 rebuild_bigram_inc2.py --verify   # é¢�å¤–å�šä¸€æ¬¡æ�ƒå¨�å…¨æ‰«æ ¸å¯¹ï¼ˆæ…¢ï¼Œå¹³æ—¶å‹¿ç”¨ï¼‰
  python3 rebuild_bigram_inc2.py --limit=500
é    Nz/root/search.dbÚindex_watermarkÚbigramz--verifyz--limit=ú=é   éÈ   iPÃ  c                 óP   — t        dt        j                  d«      ›d| ›�d¬«       y )Nú[z%Y-%m-%d %H:%M:%Sz] T)Úflush)ÚprintÚtimeÚstrftime)Úmsgs    úrebuild_bigram_inc2.pyÚlogr   -   s   € Ý	”t—}‘}Ð%8Õ9¹3Ð
?ÀtÖLó    c                 ó  — | s
t        «       S | j                  «       }t        «       }t        j                  d|«      D ]D  }t	        |«      dk  rŒt        t	        |«      dz
  «      D ]  }|j                  |||dz    «       Œ ŒF |S )uL   ä¸Ž inc2 å®Œå…¨å�Œå�£å¾„ï¼šè¿žç»­ [ä¸­æ–‡/æ•°å­—/å­—æ¯�] æ®µå†…æ‰€æœ‰ 2-gramz[\u4e00-\u9fff0-9a-z]+é   r   )ÚsetÚlowerÚreÚfindallÚlenÚrangeÚadd)ÚtextÚtÚgramsÚsegÚis        r   Úextract_gramsr    1   s€   € áÜ‹uˆØ�
‰
‹€AÜ‹E€EÜ�z‰zÐ3°QÓ7ò $ˆÜˆs‹8�aŠ<ØÜ”s˜3“x !‘|Ó$ò 	$ˆAØ�I‰I�c˜!˜A ™E�lÕ#ñ	$ð$ð
 €Lr   c                 ó*  — t        |«      D ]&  }	 | j                  d|«       |j                  «         y y# t        j                  $ rI}dt        |«      j                  «       v r(||dz
  k  r t        j                  d|dz   z  «       Y d}~Œ€‚ d}~ww xY w)uR   å†™æ‰¹æ¬¡ï¼›database is locked æ—¶é€€é�¿é‡�è¯•ï¼ˆè°ƒåº¦å™¨å¹¶è¡Œå†™åº“æ—¶é˜²å´©ï¼‰z;INSERT OR IGNORE INTO gov_bigram (rowid, gram) VALUES (?,?)TÚlockedr   é   NF)	r   ÚexecutemanyÚcommitÚsqlite3ÚOperationalErrorÚstrr   r   Úsleep)ÚcÚconnÚbatchÚretriesÚattemptÚes         r   Úinsert_batchr0   ?   s‹   € ä˜“>ò 	ˆð	Ø�M‰MÐWÐY^Ô_Ø�K‰KŒMÙð		ð øô ×'Ñ'ò 	Øœ3˜q›6Ÿ<™<›>Ñ)¨g¸À!¹Ò.CÜ—
‘
˜1 ¨!¡Ñ,Ô-ÜØûð		ús   �"6¶BÁ	>BÂBÂBc                 óæ  — | j                  dt        z  «       |j                  «        | j                  dt        z  t        f«      j	                  «       }|r|d   S t        d«       t        j                  «       }| j                  d«      j	                  «       d   }| j                  dt        z  t        |f«       |j                  «        t        d|t        j                  «       |z
  fz  «       |S )uO   è¯»æ°´ä½�çº¿ï¼›é¦–æ¬¡è¿�è¡Œç”¨ MAX(rowid) åˆ�å§‹åŒ–ï¼ˆä¸€æ¬¡æ€§ 38sï¼‰å¹¶å­˜è¡¨zCCREATE TABLE IF NOT EXISTS %s(name TEXT PRIMARY KEY, value INTEGER)z!SELECT value FROM %s WHERE name=?r   uM   é¦–æ¬¡è¿�è¡Œï¼šåˆ�å§‹åŒ–æ°´ä½�çº¿ï¼ˆMAX(rowid) å…¨æ‰«ï¼Œä¸€æ¬¡æ€§è¾ƒæ…¢ï¼‰...z.SELECT COALESCE(MAX(rowid), 0) FROM gov_bigramú2INSERT OR REPLACE INTO %s(name, value) VALUES(?,?)u   åˆ�å§‹åŒ–å®Œæˆ� wm=%d (%.0fs))ÚexecuteÚWM_TABLEr%   ÚWM_NAMEÚfetchoner   r   )r*   r+   ÚrowÚt0Úwms        r   Úget_watermarkr:   N   sÃ   € à‡I�IÐSÔV^Ñ^Ô_Ø‡K�K„MØ
�)‰)Ð7¼(ÑBÄWÀJÓ
O×
XÑ
XÓ
Z€CÙ
Ø�1‰vˆÜÐWÔXÜ	�‰‹€BØ	
�‰ÐCÓ	D×	MÑ	MÓ	OÐPQÑ	R€BØ‡I�IÐBÄXÑMÔPWÐY[È}Ô]Ø‡K�K„MÜÐ'¨2¬t¯y©y«{¸RÑ/?Ð*@Ñ@ÔAØ€Ir   c                 ób   — | j                  dt        z  t        |f«       |j                  «        y )Nr2   )r3   r4   r5   r%   )r*   r+   Úvalues      r   Úset_watermarkr=   ^   s&   € Ø‡I�IÐBÄXÑMÔPWÐY^ÐO_Ô`Ø‡K�K…Mr   c                  óÐ  ‡— t        j                  t        d¬«      } | j                  d«       | j                  d«       | j                  d«       | j	                  «       }t        || «      }|j                  d|f«      j                  «       d   }t        d||fz  «       |dk(  r"t        st        d	«       | j                  «        y |dd}}}t        j                  «       }|�r;	 |j                  d
|t        f«      j                  «       }|s�ng }	|D ]y  \  Š}
}}t        |
«      t        |«      z  t        |«      z  }|sdh}|	j                  ˆfd„|D «       «       t        |	«      t         k\  sŒ]t#        || |	«       |t        |	«      z  }g }	Œ{ |	rt#        || |	«       |t        |	«      z  }|d   d   }|t        |«      z  }t%        || |«       |dz  t        k  r't        d|||t        j                  «       |z
  fz  «       t&        r|t&        k\  rt        d«       n�Œ:|j                  d|f«      j                  «       d   }t        d||t        j                  «       |z
  ||fz  «       t        rft        d«       t        j                  «       }|j                  d«      j                  «       d   }t        d|t        j                  «       |z
  fz  «       | j                  «        y )Néx   )ÚtimeoutzPRAGMA journal_mode=WALzPRAGMA busy_timeout=120000zPRAGMA synchronous=NORMALz)SELECT COUNT(*) FROM gov_raw WHERE id > ?r   u   æ°´ä½�çº¿=%d | å¾…è¡¥ %d è¡Œu    æ— æ–°è¡Œï¼Œè·³è¿‡ï¼ˆ0 å†™å…¥ï¼‰zjSELECT id, title, COALESCE(content,''), COALESCE(summary,'') FROM gov_raw WHERE id > ? ORDER BY id LIMIT ?Ú	__empty__c              3   ó&   •K  — | ]  }‰|f–— Œ
 y ­w)N© )Ú.0ÚxÚrids     €r   ú	<genexpr>zmain.<locals>.<genexpr>�   s   øè ø€ Ò3¨A  QœxÑ3ùs   ƒéÿÿÿÿiè  u     %d/%d æ�¡, %d gram, %.0fsu   (--limit å‘½ä¸­ï¼Œå�œæ­¢)uB   å®Œæˆ�: %d æ�¡, %d gram, %.0fs | æ°´ä½�çº¿ -> %d | å‰©ä½™ç¼ºå�£ %du%   --verify: å…¨æ‰«æ ¸å¯¹ï¼ˆè¾ƒæ…¢ï¼‰...z¨
            SELECT COUNT(*) FROM gov_raw r
            LEFT JOIN (SELECT DISTINCT rowid FROM gov_bigram) b ON b.rowid = r.id
            WHERE b.rowid IS NULL
        u5   --verify ç»“æžœ: æ°´ä½�çº¿ä»¥ä¸‹é�—æ¼� %d æ�¡ (%.0fs))r&   ÚconnectÚDBr3   Úcursorr:   r6   r   ÚVERIFYÚcloser   ÚBATCHÚfetchallr    Úextendr   Ú
GRAM_FLUSHr0   r=   ÚLIMIT)r+   r*   r9   ÚgapÚlastÚdoneÚ
grams_doner8   ÚrowsÚpendingÚtitleÚcontentÚsummaryÚgÚremainÚtvÚmissrF   s                    @r   Úmainr`   c   s¶  ø€ Ü�?‰?œ2 sÔ+€DØ‡L�LÐ*Ô+Ø‡L�LÐ-Ô.Ø‡L�LÐ,Ô-Ø�‰‹€Aä	�q˜$Ó	€BØ
�)‰)Ð?À"ÀÓ
G×
PÑ
PÓ
RÐSTÑ
U€CÜÐ&¨"¨c¨Ñ2Ô3à
ˆa‚x�ÜÐ.Ô/Ø�
‰
ŒØà  A�
ˆ$€DÜ	�‰‹€BÚ
ØØ—9‘9ð@ØBFÌÀóPçPXÑPXÓPZð ñ ÙØˆGØ04ò !Ñ,��U˜G WÜ! %Ó(¬=¸Ó+AÑAÄMÐRYÓDZÑZ�ÙØ$˜�AØ—‘Ó3°Ô3Ô3Ü�w“<¤:Ó-Ü   D¨'Ô2Ø¤# g£,Ñ.�JØ ‘Gð!ñ Ü˜Q  gÔ.Øœc '›lÑ*�
Ø˜‘8˜A‘;ˆDØ”C˜“IÑˆDÜ˜!˜T 4Ô(Ø�d‰{œUÒ"ÜÐ1°T¸3À
ÌDÏIÉIËKÐZ\ÑL\Ð4]Ñ]Ô^Ý˜¤šÜÐ/Ô0Øñ5 ð8 �Y‰YÐBÀTÀGÓL×UÑUÓWÐXYÑZ€FÜÐLØ�œTŸY™Y›[¨2Ñ-¨t°VÐ
<ñ	=ô >õ ÜÐ3Ô4Ü�Y‰Y‹[ˆØ�y‰yð ó ÷ ‰X‹Z˜ñ	ˆô
 	ÐCÀtÌTÏYÉYË[Ð[]ÑM]ÐF^Ñ^Ô_Ø‡J�J…Lr   Ú__main__)é(   )Ú__doc__r&   r   Úsysr   rJ   r4   r5   ÚargvrL   rR   Ú_aÚ
startswithÚintÚsplitrN   rQ   r   r    r0   r:   r=   r`   Ú__name__rC   r   r   ú<module>rk      s­   ðñ÷6 × à€Ø€Ø
€Ø	�s—x‘xÐ	€Ø€Ø
�(‰(ò )€BØ	‡}�}�ZÕ Ù�B—H‘H˜S !Ó$ QÑ'Ó(‰ð)ð 	€Ø€
òMòóòò ò
<ð~ ˆzÒÙ…Fð r   