From 1509eeb9892f63fa9535b21f754bd0c1a3988539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 23 Aug 2026 12:02:32 +0300 Subject: [PATCH] =?UTF-8?q?v0.0.61:=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BB=D0=BB?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D1=83=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B0=20=E2=80=94=20.doc=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20liberta=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20?= =?UTF-8?q?(liberta=20=D0=BD=D0=B5=20=D1=82=D1=8F=D0=BD=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C,=20javaldx),=20LLM=20=5FLLM=5FCONCURRE?= =?UTF-8?q?NCY=3D1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drhider/obfuscator.py | 22 ++++------------------ drhider/scanner.py | 2 +- site/app.py | 2 +- 3 files changed, 6 insertions(+), 20 deletions(-) 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():