diff --git a/drhider/obfuscator.py b/drhider/obfuscator.py index 8bb2071..cd3ad40 100644 --- a/drhider/obfuscator.py +++ b/drhider/obfuscator.py @@ -11,7 +11,6 @@ import io import os import time import logging -from concurrent.futures import ThreadPoolExecutor from typing import Dict, List, Tuple, Callable, Optional from . import extractor @@ -118,19 +117,9 @@ class TwoPassObfuscator: file_times: List[float] = [0.0] * total skipped: set = set() # имена файлов, которые не удалось обработать (битые) - # A1: .doc конвертируются через HTTP-сервис liberta (IO-bound). - # Запускаем их в потоках — GIL не мешает (ожидание сети), а основное - # время (PDF/docx, CPU-bound) перекрывается с HTTP-конвертацией .doc. - 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 - ) + # A1: .doc конвертируются через HTTP-сервис liberta ПОСЛЕДОВАТЕЛЬНО. + # Без параллельности: liberta не выдерживает конкурентные вызовы + # (libreoffice падает с javaldx). for i, (fname, content, ctype) in enumerate(files): display_name = os.path.basename(fname) or fname @@ -139,10 +128,7 @@ class TwoPassObfuscator: t0 = time.time() try: - if i in doc_futures: - text = doc_futures[i].result() - else: - text = extractor.extract_text(fname, content, ctype) + text = extractor.extract_text(fname, content, ctype) except Exception as e: log.warning("obfuscate: skip file %r: %r", fname, e) skipped.add(fname) diff --git a/drhider/scanner.py b/drhider/scanner.py index d7d292c..08801e0 100644 --- a/drhider/scanner.py +++ b/drhider/scanner.py @@ -115,7 +115,7 @@ def scan_regex(text: str, mapping: Dict[str, str], counters: Dict[str, int]) -> _CHUNK_BOUNDARIES = ['\n\n', '\n', '. ', '? ', '! ', '; ', ', ', ' '] _CHUNK_SIZE = 6000 # символов на чанк (≈1500-2000 токенов RU — NER-качество) _CHUNK_OVERLAP = 500 # перекрытие чанков (сущности на стыке) -_LLM_CONCURRENCY = 4 # параллельных LLM-вызовов +_LLM_CONCURRENCY = 1 # параллельность убрана — всё последовательно (liberta/LLM не тянет конкурентность) def split_into_chunks(text: str, size: int = _CHUNK_SIZE, diff --git a/site/app.py b/site/app.py index 950cd5e..6aa076a 100644 --- a/site/app.py +++ b/site/app.py @@ -21,7 +21,7 @@ if _sys_path_root not in sys.path: sys.path.insert(0, _sys_path_root) # Версия приложения (меняется при изменениях) -VERSION = "0.0.60" +VERSION = "0.0.61" def setup_logging():