2016-06-16 5 views
2

Я создал сценарий, который содержит цикл for, который выбирает столбцы из 533 различных файлов excel и помещает их в матрицы, чтобы их можно было сравнивать, однако процесс занимает слишком много времени (он работал в течение 3 часов вчера и даже не был на полпути!!).Как увеличить скорость этого цикла xlsread?

Я знаю, что xlsread, естественно, медленный, но кто-нибудь знает, как я могу заставить свой скрипт работать быстрее? Скрипт ниже, спасибо!

%Split the data into g's and h's 
CRNum = 533; %Number of Carrington Rotation files 
A(:,1) = xlsread('CR1643.xlsx','A:A'); % Set harmonic coefficient columns 
A(:,2) = xlsread('CR1643.xlsx','B:B'); 
B(:,1) = xlsread('CR1643.xlsx','A:A'); 
B(:,2) = xlsread('CR1643.xlsx','B:B'); 

for k = 1:CRNum 
    textFileName = ['CR' num2str(k+1642) '.xlsx']; 
A(:,k+2) = xlsread(textFileName,'C:C'); %for g 
B(:,k+2) = xlsread(textFileName,'D:D'); %for h 
end 
+2

Возможно, вы можете объединить много файлов в один, а затем просто прочитать с разных листов внутри него. В этом случае вам нужно будет только «открыть файл для чтения» один раз. См. [Xlsread1] (http://www.mathworks.com/matlabcentral/fileexchange/22365-function-for-faster-data-transfer-matlab-%3C-%3E-excel) для объяснения, почему он работает лучше. –

+0

Как быстро это действительно нужно? Если вы просто позволите этому запустить вчера, то, вероятно, уже закончили. (вы можете распечатать прогресс по ходу дела, если вы решите сделать это так.) –

+0

Я полагаю, что это не должно быть удивительно быстро, однако вчера я запускал его на своем ноутбуке, который начал чрезмерно перегреваться (это ужасный ноутбук), и поэтому я решил запустить его на компьютерах университетских кампусов сегодня, которые быстрее! Как распечатать прогресс, когда я иду? –

ответ

1

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

M(:,k+2) = xlsread(textFileName,'C:D'); 

Также проверьте, сколько вы читаете в каждый раз, если вы читали во многих строк в первом файле, вы можете сделать первое измерение A большой, и тогда вы будете заполнить его каждый раз, когда вы читаете файл?

В дополнение: небольшое, но простое улучшение можно найти в начале. Не используйте 4 оператора загрузки, но используйте 1, а затем назначьте переменные на основе результата.

+0

Значит, вы имеете в виду что-то вроде этого? 'для k = 1: CRNum' ' textFileName = ['CR' num2str (k + 1642) '.xlsx']; ' ' C = xlsread (textFileName, 'C: D'); ' ' A (:, k + 2) = C (:, 1); ' ' B (:, k + 2) = C (:, 2); ' ' end' В каждом случае считывается 55 строк, добавляя столбцы в A –

+0

Как вы упомянули в университете, это задание можно легко распараллелить, если вы можете получить доступ к файлам на нескольких компьютерах. Первый компьютер строит матрицу для 'k = 1: 100', далее для' k = 101: 200' и ​​т. Д. –

+0

@RThompson Это действительно то, что я имел в виду. Просто попробуйте несколько файлов и посмотрите, помогает ли это. Если он все еще медленный, прокомментируйте свой код и посмотрите, куда идет время. Если он по-прежнему в основном обращается к 'xlsread', я не думаю, что вы можете сделать многое другое о логике здесь. Затем вы можете попробовать, поможет ли 'xlsread1'. - Бит поздно, но если вы запустили его на 3 часа вчера, вы могли бы просто сохранить результаты и забрать его еще на 3 часа сегодня! –

2

Не используйте xlsread, если вы хотите пройти цикл. потому что он открывает excel и затем закрывает excel-сервер каждый раз, когда вы его вызываете, что требует много времени. вместо этого перед циклом используйте actxserver, чтобы открыть excel, сделайте то, что хотите, и, наконец, закройте actxserver после вашего цикла. Для хорошего примера использования actxserver, найдите «Чтение данных электронных таблиц с использованием Excel в качестве сервера автоматизации» в справке MATLAB.

Также обратите внимание на readtable, который работает быстрее, чем xlsread, но вместо этого генерирует таблицу.

+0

Найдите простой пример с основными командами в MATLAB Help: http://de.mathworks.com/help/matlab/matlab_external/using-a-matlab-application-as-an-automation-client.html – bushmills

+0

, и если вы запускают MATLAB на Linux-машине, вам нужно использовать библиотеку POI Apache для записи данных в книгу Excel. Следующая функция обмена файлами дает вам обзор рабочего процесса: https://www.mathworks.com/matlabcentral/fileexchange/38591-xlwrite--generate-xls-x--files-without-excel-on-mac -linux-win – bushmills

+0

Не могу попробовать, но это дало мне представление о том, что использование 'num = xlsread (filename, sheet, xlRange, 'basic')' также может повлиять на производительность, поскольку оно не вызовет Excel. –

0

Как уже упоминалось в this post, самой простой заменой было бы установить «Базовый» в true. Это отключает такие вещи, как формулы и макросы в Excel, и позволяет быстрее читать простую таблицу. Например, вы можете использовать:

xlsread('CR1643.xlsx','A:A', 'Basic', true)

Это привело к уменьшению времени загрузки приблизительно от 22 секунд до 1 секунды для меня, когда я тестировал его на 11000. на 7 листе Excel.