Самый быстрый способ разобрать TXT построчно - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь анализировать большой TXT-файл построчно (6 млн. Строк, 200 МБ), используя операторы if с методом String.contains (String).На данный момент он очень медленный, есть способ улучшить скорость.

Я знаю, что есть также String.firstIndexOf, но, похоже, он медленнее.Regex, вероятно, тоже медленнее.

Импорт строк TXT и разбиения:

   let content = try String(contentsOfFile:path, encoding: String.Encoding.ascii)
           print("LOADED 0");
           return content.components(separatedBy: "\n")

Синтаксический анализ:

     if(line.contains("<TAG1>")) {
         var thisline = line;
         thisline = thisline.replacingOccurrences(of: "<TAG1>", with: "")
         thisline = thisline.replacingOccurrences(of: "</TAG1>", with: "")
         text = "\(text)\n\(thisline): ";
     } else if(line.contains("<TAG2>")) {
         var thisline = line;
         thisline = thisline.replacingOccurrences(of: "<TAG2>", with: "")
         thisline = thisline.replacingOccurrences(of: "</TAG2>", with: "")
         text = "\(text) - \(thisline) ";
     }

Вероятно, будет больше операторов if (которые, вероятно,замедлите синтаксический анализ еще больше)

Было бы здорово, если бы скорость могла быть улучшена, это занимает ок.5-10 минут на моем Macbook (в зависимости от размера файла)

Редактировать: Кажется, что строка + "\ n" + строка2 быстрее, чем "(строка) \ n (строка2)", но это не такСлишком много помогает

Edit2: я добавил индикатор прогресса в приложение, и кажется, что он быстро запускается и замедляется к концу?

1 Ответ

1 голос
/ 27 сентября 2019

Создание вашей окончательной переменной text в том виде, в каком вы есть, приводит к тому, что постоянно растущая строка копируется (с небольшим добавлением) для каждой строки, а затем снова присваивается обратно text.

// Slow
text = "\(text)\n\(thisline): "

Добавление только дополнения к исходной переменной будет намного быстрее:

// Fast(er)
text.append("\n\(thisline): ")

В зависимости от требуемого уровня сложности (и является ли это однократным преобразованием или что-то, что будет происходить часто?), вы можете захотеть взглянуть на предложение @ rmaddy об использовании правильного парсера.

...