Summary / Описание проблемы
При сохранении или копировании результатов SQL-запроса в формате CSV (saveResultGridCsvFile или буфер обмена в results_tab.dart), генерация CSV-текста выполняется синхронно в основном UI-изоляте функцией resultGridAsCsv:
String resultGridAsCsv(List<String> columns, List<List<String>> rows) {
final lines = <String>[
columns.map(escapeCsvField).join(','),
...rows.map((r) { ... return cells.join(','); }),
];
return lines.join('\n');
}
При экспорте выборок большого объема (например, 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/core/csv/save_result_grid_csv.dart (строка ~25)
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 / Критерии приемки
Summary / Описание проблемы
При сохранении или копировании результатов 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
desktopCore / CSV Exporter & Table Viewbugmediumdev / 0.5.0Местоположение в коде
lib/core/csv/result_grid_csv.dart(строки ~16-29, функцияresultGridAsCsv)lib/core/csv/save_result_grid_csv.dart(строка ~25)lib/features/main_screen/results_tab.dart(строки ~87 и ~126)Шаги воспроизведения
ResultsTab) нажатьSave as CSV…илиCopy as CSV.saveResultGridCsvFile) должен выполняться потоково (File.openWrite()с постепенной записью чанков без накопления в памяти), а генерация строки для буфера обмена должна происходить в фоновом изоляте (compute(...)) или с ограничением максимального числа копируемых строк.Acceptance Criteria / Критерии приемки
saveResultGridCsvFile) реализована потоковая запись на диск черезIOSink/File.openWrite(), исключающая формирование всего CSV в одной переменнойString.compute(...)илиIsolate.run), чтобы не блокировать главный UI-поток Flutter.