Чтение файла построчно в dart

Я пытаюсь обрабатывать большие текстовые файлы на языке Dart. Файлы имеют размер более 100 МБ.

Я пробовал readAsLines и readAsLinesSync методы dart:io библиотеки. Каждый раз, когда заканчивается память: Exhausted heap space.

Есть ли способ читать файл построчно или побайтно, как на других языках?


person Martin Janda    schedule 16.02.2014    source источник


Ответы (2)


Это должно читать файл по частям:

import 'dart:async';
import 'dart:io';
import 'dart:convert';

main() {
  var path = ...;
  new File(path)
    .openRead()
    .map(utf8.decode)
    .transform(new LineSplitter())
    .forEach((l) => print('line: $l'));
}

Об этом пока не так много документации. Возможно, отправьте сообщение об ошибке, запросив дополнительные документы.

person Greg Lowe    schedule 16.02.2014

В последней версии dart UTF8.decoder теперь называется utf8.decoder:

import 'dart:async';
import 'dart:io';
import 'dart:convert';

main() {
  var path = ...;
  new File(path)
    .openRead()
    .transform(utf8.decoder)
    .transform(new LineSplitter())
    .forEach((l) => print('line: $l'));
}
person Brett Sutton    schedule 10.10.2019
comment
Проголосовали против, потому что вы должны были отредактировать предыдущий ответ. - person Michael Pfaff; 28.10.2019
comment
Я даже не знал, что вы можете редактировать чей-то ответ. Есть ли какой-то этикет, чтобы просто обновить чей-то ответ? - person Brett Sutton; 29.10.2019
comment
Проголосовали за, потому что этикет, как правило, заключается в том, чтобы не изменять код в ответах других людей, хотя изменение другого контента обычно нормально. Однако это мог быть просто комментарий под ответом. - person Suragch; 17.01.2020
comment
Спасибо за комментарий и голосование. Как пользователь переполнения стека, я бы предпочел получить полный ответ (однако мы пришли к этому), поскольку слишком легко пропустить заметки в разделе комментариев. - person Brett Sutton; 19.01.2020
comment
Я только что опубликовал свой ответ, но потом понял, что он такой же, как ваш, и удалил его. Помимо изменения UTF8 на utf8, вы также заменили карту другим преобразованием. Я сначала этого не заметил. Эта карта вызвала исключение в моем коде. Не могли бы вы объяснить, почему вы удалили карту? Что значит трансформировать? (Кстати, если вы добавите @Suragch в свой комментарий, я получу уведомление, когда вы ответите.) - person Suragch; 24.01.2020
comment
@suragch Карта используется для перевода входных данных от одного объекта к другому. Итак, вы читаете текстовый файл, вы выполняете преобразование utf8 для преобразования из байтов (это то, что возвращает openRead, затем второе преобразование разбивает символы (ну, в дротике на самом деле есть односимвольные строки) на строки. Затем вы могли бы сделать карта для преобразования строк, скажем, в целое число, если вы знали, что файл, который вы читаете, имеет одно число в каждой строке. - person Brett Sutton; 24.01.2020
comment
Почему вы удалили карту из своего ответа, которую использует ответ Грега Лоу? - person Suragch; 24.01.2020