diff --git a/main.py b/main.py index 10e8b5e..911c16a 100755 --- a/main.py +++ b/main.py @@ -40,6 +40,7 @@ STANDARD_FOURIER_ROWS = 60 STANDARD_FOURIER_COLS = 100 MAX_PROCESSING_TIME_MS = 250 +FILES_STORED_N_MAX = 100 # ПЕРЕЧИСЛЕНИЕ ТИПОВ ДАННЫХ DATA_TYPE_RAW = "RAW" @@ -58,7 +59,7 @@ DEFAULT_FILE_INTERVAL_MS = 300 # 300 мс GAP_THRESHOLD_MULTIPLIER = 1.5 # Начальное время опроса файлов (в миллисекундах) -DEFAULT_FILE_POLL_INTERVAL_MS = 100 # 100 мс +DEFAULT_FILE_POLL_INTERVAL_MS = 80 # 100 мс # ================================================================================ @@ -1253,9 +1254,85 @@ class DataAnalyzerApp: self.processed_files.add(fname) self.do_pending_update() + # Очистка старых файлов, чтобы хранить не более FILES_STORED_N_MAX + #self.cleanup_old_files() //stores only last FILES_STORED_N_MAX files + self.cleanup_by_size(max_bytes=500*1024*1024) #stores not more than 0.5 Gb of data # Используем переменное время опроса self.root.after(self.file_poll_interval_ms, self.process_files) + def cleanup_old_files(self): + try: + files = [ + f for f in os.listdir() + if f.lower().endswith(('.txt', '.txt1', '.txt2', '.csv')) + ] + if len(files) <= FILES_STORED_N_MAX: + return + # Сортировка по времени изменения (старые сначала) + files_sorted = sorted(files, key=lambda fn: os.path.getmtime(fn)) + to_delete = files_sorted[:len(files) - FILES_STORED_N_MAX] + deleted = 0 + for fn in to_delete: + try: + os.remove(fn) + deleted += 1 + # Поддерживаем список обработанных + if fn in self.processed_files: + self.processed_files.discard(fn) + except Exception: + pass + if deleted: + timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3] + print(f"[{timestamp}] 🧹 Cleanup: removed {deleted} old file(s)") + except Exception: + pass + + def cleanup_by_size(self, max_bytes=500 * 1024 * 1024): + """Альтернативный сборщик: удаляет самые старые .csv/.txt, + если суммарный объём в папке превышает max_bytes (по умолчанию ~500 МБ).""" + try: + # Берём только обычные файлы текущей директории данных + files = [ + f for f in os.listdir() + if os.path.isfile(f) and f.lower().endswith(('.csv', '.txt')) + ] + # Подсчёт общего объёма + meta = [] # (name, size, mtime) + total_size = 0 + for fn in files: + try: + sz = os.path.getsize(fn) + mt = os.path.getmtime(fn) + meta.append((fn, sz, mt)) + total_size += sz + except Exception: + continue + + if total_size <= max_bytes: + return + + # Сортируем по времени изменения (старые сначала) и удаляем, пока не уложимся + meta.sort(key=lambda t: t[2]) + deleted = 0 + for fn, sz, _ in meta: + if total_size <= max_bytes: + break + try: + os.remove(fn) + total_size -= sz + deleted += 1 + if fn in self.processed_files: + self.processed_files.discard(fn) + except Exception: + continue + + if deleted: + timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3] + mb = max_bytes / (1024 * 1024) + print(f"[{timestamp}] 🧹 Collector: removed {deleted} file(s) to keep <= {mb:.0f} MB") + except Exception: + pass + # ================================================================================ # ТОЧКА ВХОДА