You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
bug(csv): synchronous string generation in resultGridAsCsv freezes UI isolate and risks memory exhaustion on large datasets #277
При сохранении или копировании результатов SQL-запроса в формате CSV (saveResultGridCsvFile или буфер обмена в results_tab.dart), генерация CSV-текста выполняется синхронно в основном UI-изоляте функцией resultGridAsCsv:
При экспорте выборок большого объема (например, 50 000 — 100 000 строк из PostgresTableView или окна Results), resultGridAsCsv мгновенно создает в оперативной памяти миллионы промежуточных объектов строк (List.generate + .map + .join), что приводит к полной заморозке (freeze) интерфейса Flutter на несколько секунд, а на слабых машинах вызывает аварийное завершение процесса по исчерпанию памяти (OutOfMemoryError).
Scope & Component
Scope:desktop
Component:Core / CSV Exporter & Table View
Kind:bug
Severity:medium
Detected in version:dev / 0.5.0
Местоположение в коде
Файлы:
lib/core/csv/result_grid_csv.dart (строки ~16-29, функция resultGridAsCsv)
lib/features/main_screen/results_tab.dart (строки ~87 и ~126)
Шаги воспроизведения
Выполнить SQL-запрос, возвращающий 50 000+ строк из широкой таблицы.
В панели результатов (ResultsTab) нажать Save as CSV… или Copy as CSV.
Фактический результат: Интерфейс приложения полностью зависает (не реагирует на клики и перерисовку) на время генерации одной гигантской строки.
Ожидаемый результат: Экспорт в файл (saveResultGridCsvFile) должен выполняться потоково (File.openWrite() с постепенной записью чанков без накопления в памяти), а генерация строки для буфера обмена должна происходить в фоновом изоляте (compute(...)) или с ограничением максимального числа копируемых строк.
Acceptance Criteria / Критерии приемки
Для экспорта в файл (saveResultGridCsvFile) реализована потоковая запись на диск через IOSink / File.openWrite(), исключающая формирование всего CSV в одной переменной String.
Тяжелые операции форматирования CSV для буфера обмена вынесены в фоновый изолят (compute(...) или Isolate.run), чтобы не блокировать главный UI-поток Flutter.
Activity
ZhuchkaTriplesix commentedon Jul 10, 2026
Fixed in #287: CSV file export streams via IOSink; clipboard CSV is built in a background isolate.
Merge pull request #287 from QueryaHub/issue/277-csv-streaming-isolate
fix(csv): stream file export and build clipboard CSV off the UI isola…
Merge pull request #287 from QueryaHub/issue/277-csv-streaming-isolate