Matlab - Meningkatkan efisiensi metode pembacaan file

Saya sedang menulis skrip Matlab yang dimulai dengan membaca file .log yang dibatasi spasi ke dalam array sel. Header kolom dalam file semuanya berupa string, tetapi tipe data di seluruh file tercampur, jadi untuk kesederhanaan saya telah memperlakukan setiap nilai sebagai string untuk saat ini.

Inilah yang saya miliki sejauh ini, dan berfungsi dengan baik dengan file kecil.

fileID = fopen('file');
ImportData = char.empty; % create empty array to add on to

while ~feof(fileID)
    tLines = fgetl(fileID); % reads line into string
    raw = strsplit(tLines, ' '); %splits line into array for that line
    ImportData = cat(1, ImportData, raw); %adds line to rest of array
end

fclose(fileID);

Namun file sebenarnya yang perlu dibaca skrip ini sangat berat (30.000+ baris, 200+ kolom) dan menurut saya prosedur ini sangat lambat untuk itu. Saya telah melakukan beberapa penelitian dan saya yakin bahwa vektorisasi adalah jawabannya, tetapi saya sangat asing dengan bidang ini.

Apa saja cara saya dapat mengubah prosedur ini untuk meningkatkan kecepatan secara dramatis?

EDIT: Tipe kolom tidak konsisten, sehingga fungsi importdata tidak berfungsi. File tersebut memiliki ekstensi .log, sehingga fungsi readtable tidak berfungsi. Idealnya, metode yang lebih cepat dalam menggunakan pemindaian teks akan menjadi sempurna.


person BayesianRegret    schedule 29.06.2015    source sumber
comment
Apakah jumlah kolomnya tetap?   -  person nkjt    schedule 29.06.2015
comment
Jika jumlah kolom (dan jenis per kolom tentu saja) sama untuk setiap baris, Anda dapat menggunakan matlab apa pun yang dibangun dalam fungsionalitas pembaca file. Misalnya importdata, xlsread atau fungsi apa pun yang berfungsi. Anda juga dapat menggunakan baris pertama sebagai templat dan mendesain fscanf. Selanjutnya, dimungkinkan untuk menggunakan metode textscan, yang Anda tentukan pembatas. Sulit memberikan saran tanpa mengetahui format datanya   -  person patrik    schedule 29.06.2015
comment
@CarlWitthoft Saya pikir ImportData adalah variabel. Kode yang diberikan sepertinya seperti kode-c. Sarannya adalah lebih baik menggunakan perpustakaan Matlab yang luas.   -  person patrik    schedule 30.06.2015
comment
@patrik 'ImportData' adalah variabel di sini. Tipe datanya tidak konsisten di seluruh file - beberapa kolom berupa string dan ada pula yang numerik. Itu sebabnya sepanjang pengetahuan saya fungsi 'importdata' tidak akan berfungsi. 'textscan' adalah apa yang saya gunakan, tetapi masalah saya adalah ketidakefisienannya untuk file besar.   -  person BayesianRegret    schedule 30.06.2015
comment
kemungkinan duplikat Pembacaan file Matlab tercepat?   -  person rst    schedule 30.06.2015


Jawaban (1)


readtable(filename,'FileType','text','Delimiter',' ')

seharusnya bekerja dengan baik. Ekstensi file ".log" tidak relevan selama file Anda dibatasi dengan ' '. Anda dapat menentukan lebih lanjut format string/urutan jika Anda memiliki pengetahuan sebelumnya tentang format kolom. Menentukan string format dapat membuat pengoperasian lebih cepat. Jika Anda tidak menentukan format maka ia akan mengembalikan numerik jika seluruh kolom berupa numerik atau string sel jika dicampur.

person PHB    schedule 30.06.2015
comment
Terima kasih! Itulah yang saya cari. - person BayesianRegret; 01.07.2015
comment
Senang aku dapat membantu. Bisakah Anda memilih jawaban saya? - person PHB; 03.07.2015