Как ускорить чтение больших файлов в GNU Octave? - PullRequest
3 голосов
/ 20 июня 2020

Я импортирую большой файл CSV в GNU Octave, выполняю некоторые простые операции с данными и создаю несколько графиков. В файле около 6,5 миллионов строк. Я ожидал, что процесс чтения файла займет около двух-трех часов, потому что, по моему опыту, именно столько времени обычно требуется для создания файла такого размера. Добавлен счетчик статуса, когда он не завершается и обнаруживает, что он замедляется при чтении; через 12 часов только на линии 1,5 миллиона и движется ползком. Однако, согласно Resource Monitor, проблем с памятью нет. Есть ли более эффективный способ чтения кода, чем тот, который я привел ниже? Нужно ли мне делать что-то особенное, чтобы выделить память для процесса, чтобы он не замедлялся? Это l oop, которое читается в CSV. Это время l oop, которое сканирует CSV по одной строке, извлекает нужные мне столбцы и заканчивается, когда достигает первой пустой строки:

% Process File
  F=1;
  while 1
    % Status Counter
        printf ("Status: %d \r", F);
        fflush (stdout);
        F=F+1;
    % Read first unread line
        line = fgetl(fileID);
    % Exit while loop if line is empty
        if ~ischar(line)
          break;
        endif
    % Translate Line
        Bank = textscan (line, '%f',  'Delimiter', ',');
        Bank = cell2mat (Bank);
        Bank = transpose (Bank);
    % Append Bank to Output
      Output = [Output; Bank(1, 1:9), Bank(1, 13:14), Bank(1, 20:21)];
  endwhile

1 Ответ

3 голосов
/ 20 июня 2020

Это медленная часть:

Output = [Output; Bank(1, 1:9), Bank(1, 13:14), Bank(1, 20:21)];

Здесь вы создаете новую матрицу, копируете в нее Output и новую строку и назначаете ее Output. По мере увеличения размера Output копия становится все более дорогой.

Что вам нужно сделать, так это предварительно выделить выходной массив. Всегда выделяйте заранее!

...