v0.0.61: параллельность убрана — .doc через liberta последовательно (liberta не тянет конкурентность, javaldx), LLM _LLM_CONCURRENCY=1
Deploy drhider / validate (push) Canceled after 0s

This commit is contained in:
“Naeel”
2026-08-23 12:02:32 +03:00
parent c17fca792c
commit 1509eeb989
3 changed files with 6 additions and 20 deletions
+4 -18
View File
@@ -11,7 +11,6 @@ import io
import os import os
import time import time
import logging import logging
from concurrent.futures import ThreadPoolExecutor
from typing import Dict, List, Tuple, Callable, Optional from typing import Dict, List, Tuple, Callable, Optional
from . import extractor from . import extractor
@@ -118,19 +117,9 @@ class TwoPassObfuscator:
file_times: List[float] = [0.0] * total file_times: List[float] = [0.0] * total
skipped: set = set() # имена файлов, которые не удалось обработать (битые) skipped: set = set() # имена файлов, которые не удалось обработать (битые)
# A1: .doc конвертируются через HTTP-сервис liberta (IO-bound). # A1: .doc конвертируются через HTTP-сервис liberta ПОСЛЕДОВАТЕЛЬНО.
# Запускаем их в потоках — GIL не мешает (ожидание сети), а основное # Без параллельности: liberta не выдерживает конкурентные вызовы
# время (PDF/docx, CPU-bound) перекрывается с HTTP-конвертацией .doc. # (libreoffice падает с javaldx).
doc_futures: Dict[int, object] = {}
doc_indices = [i for i, (f, _, _) in enumerate(files)
if f.lower().endswith('.doc')]
if doc_indices:
with ThreadPoolExecutor(max_workers=min(4, len(doc_indices))) as _ex:
for i in doc_indices:
fname, content, ctype = files[i]
doc_futures[i] = _ex.submit(
extractor.extract_text, fname, content, ctype
)
for i, (fname, content, ctype) in enumerate(files): for i, (fname, content, ctype) in enumerate(files):
display_name = os.path.basename(fname) or fname display_name = os.path.basename(fname) or fname
@@ -139,10 +128,7 @@ class TwoPassObfuscator:
t0 = time.time() t0 = time.time()
try: try:
if i in doc_futures: text = extractor.extract_text(fname, content, ctype)
text = doc_futures[i].result()
else:
text = extractor.extract_text(fname, content, ctype)
except Exception as e: except Exception as e:
log.warning("obfuscate: skip file %r: %r", fname, e) log.warning("obfuscate: skip file %r: %r", fname, e)
skipped.add(fname) skipped.add(fname)
+1 -1
View File
@@ -115,7 +115,7 @@ def scan_regex(text: str, mapping: Dict[str, str], counters: Dict[str, int]) ->
_CHUNK_BOUNDARIES = ['\n\n', '\n', '. ', '? ', '! ', '; ', ', ', ' '] _CHUNK_BOUNDARIES = ['\n\n', '\n', '. ', '? ', '! ', '; ', ', ', ' ']
_CHUNK_SIZE = 6000 # символов на чанк (≈1500-2000 токенов RU — NER-качество) _CHUNK_SIZE = 6000 # символов на чанк (≈1500-2000 токенов RU — NER-качество)
_CHUNK_OVERLAP = 500 # перекрытие чанков (сущности на стыке) _CHUNK_OVERLAP = 500 # перекрытие чанков (сущности на стыке)
_LLM_CONCURRENCY = 4 # параллельных LLM-вызовов _LLM_CONCURRENCY = 1 # параллельность убрана — всё последовательно (liberta/LLM не тянет конкурентность)
def split_into_chunks(text: str, size: int = _CHUNK_SIZE, def split_into_chunks(text: str, size: int = _CHUNK_SIZE,
+1 -1
View File
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root) sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях) # Версия приложения (меняется при изменениях)
VERSION = "0.0.60" VERSION = "0.0.61"
def setup_logging(): def setup_logging():