Matlab - ปรับปรุงประสิทธิภาพของวิธีการอ่านไฟล์

ฉันกำลังเขียนสคริปต์ Matlab ซึ่งเริ่มต้นด้วยการอ่านไฟล์ .log ที่คั่นด้วยช่องว่างลงในอาร์เรย์ของเซลล์ ส่วนหัวของคอลัมน์ในไฟล์เป็นสตริงทั้งหมด แต่มีประเภทข้อมูลทั่วทั้งไฟล์ผสมกัน ดังนั้นเพื่อความง่าย ฉันจึงถือว่าทุกค่าเป็นสตริงในตอนนี้

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ และใช้งานได้ดีกับไฟล์ขนาดเล็ก

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);

อย่างไรก็ตาม ไฟล์จริงที่สคริปต์นี้จะต้องอ่านนั้นเทอะทะมาก (30,000+ แถว, 200+ คอลัมน์) และฉันพบว่าขั้นตอนนี้ช้ามากสำหรับสิ่งนั้น ฉันค้นคว้ามาแล้วและมั่นใจว่าการใช้เวกเตอร์เป็นคำตอบ แต่ฉันไม่คุ้นเคยมากนักในด้านนี้

ฉันสามารถปรับเปลี่ยนขั้นตอนนี้เพื่อเพิ่มความเร็วได้อย่างมากด้วยวิธีใดบ้าง

แก้ไข: ประเภทคอลัมน์ไม่สอดคล้องกัน ดังนั้นฟังก์ชัน importdata จึงใช้งานไม่ได้ ไฟล์นี้มีนามสกุล .log ดังนั้นฟังก์ชัน readtable จึงใช้งานไม่ได้ ตามหลักการแล้ววิธีการใช้การสแกนข้อความที่เร็วขึ้นจะสมบูรณ์แบบ


person BayesianRegret    schedule 29.06.2015    source แหล่งที่มา
comment
จำนวนคอลัมน์คงที่หรือไม่?   -  person nkjt    schedule 29.06.2015
comment
ในกรณีที่จำนวนคอลัมน์ (และประเภทต่อคอลัมน์) เท่ากันสำหรับทุกแถว คุณสามารถใช้ Matlab ใดก็ได้ที่มีอยู่ในฟังก์ชันโปรแกรมอ่านไฟล์ ตัวอย่างเช่น importdata, xlsread หรือฟังก์ชันการทำงานใดๆ คุณสามารถใช้บรรทัดแรกเป็นเทมเพลตและออกแบบ fscanf ได้ นอกจากนี้ คุณสามารถใช้เมธอด textscan ได้ โดยที่คุณระบุ ตัวคั่น เป็นการยากที่จะให้คำแนะนำโดยไม่ทราบรูปแบบข้อมูล   -  person patrik    schedule 29.06.2015
comment
@CarlWitthoft ฉันคิดว่า ImportData เป็นตัวแปร รหัสที่ให้มาดูเหมือนจะเป็นรหัส c ข้อเสนอแนะคือควรใช้ไลบรารี่ที่กว้างขวางของ Matlab   -  person patrik    schedule 30.06.2015
comment
@patrik 'ImportData' เป็นตัวแปรที่นี่ ประเภทข้อมูลไม่สอดคล้องกันตลอดทั้งไฟล์ - บางคอลัมน์เป็นสตริงและบางคอลัมน์เป็นตัวเลข นั่นเป็นเหตุผลว่าทำไมเท่าที่ทราบมา ฟังก์ชัน 'importdata' จึงไม่ทำงาน 'textscan' คือสิ่งที่ฉันใช้อยู่ แต่ปัญหาของฉันคือมันไม่มีประสิทธิภาพสำหรับไฟล์ขนาดใหญ่   -  person BayesianRegret    schedule 30.06.2015
comment
เป็นไปได้ที่ซ้ำกันของ การอ่านไฟล์ Matlab ที่เร็วที่สุด?   -  person rst    schedule 30.06.2015


คำตอบ (1)


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

ควรทำงานได้ดี นามสกุลไฟล์ ".log" จะไม่เกี่ยวข้องตราบใดที่ไฟล์ของคุณคั่นด้วย ' ' คุณสามารถระบุรูปแบบสตริง/ลำดับเพิ่มเติมได้ หากคุณมีความรู้เกี่ยวกับรูปแบบคอลัมน์มาก่อน การระบุสตริงรูปแบบสามารถทำให้การดำเนินการเร็วขึ้นมาก หากคุณไม่ระบุรูปแบบ ระบบจะส่งกลับตัวเลขหากทั้งคอลัมน์เป็นตัวเลขหรือสตริงเซลล์หากผสมกัน

person PHB    schedule 30.06.2015
comment
ขอบคุณ! นั่นคือสิ่งที่ฉันกำลังมองหา - person BayesianRegret; 01.07.2015
comment
ดีใจที่สามารถช่วยได้ คุณช่วยลงคะแนนให้คำตอบของฉันได้ไหม? - person PHB; 03.07.2015