我有一个300MB的ascii文件,包含9列数据(制表符分隔,字符串和数字)。下面给出了一个示例行:
11204226 736539.402697000 192.168.0.104 10.0324 0 1.1313 3.543 3 9
文件结构良好,不存在空行或错误行。整个文件格式保持不变
当我尝试在Ubuntu 14.04中加载(importdata)文件时。 LTS,6GB RAM,Matlab 2015b系统刚冻结。我的同事成功地将文件加载到Windows 7,8GB RAM,Matlab 2014b中。
但是计划是将数据保存在.mat文件中,他也不能这样做。创建一个文件,但是大小增加到1GB以上,没有任何迹象表明它已经结束
我尝试通过图形界面或以下代码加载数据:
tdata = importdata('data.dat');
还通过图形界面尝试保存.mat文件。
我认为300MB的文件不应该构成这样的挑战。
您选择以哪种方式处理文件?
我希望.mat文件小于普通的ascii文件
此外,我的计划是避免将原始文件分成小块。
更新:
我的同事能够加载数据,将结构中的所有字符串条目转换为数字。这是前三列。除了由IP地址组成的第三列之外,我不确定为什么它们作为字符串导入。具有全数矩阵可以存储数据,并且得到的.mat文件大小为15MB。某种程度上,字符串和数字的混合搞砸了一切。还是不知道为什么。
答案 0 :(得分:0)
我在上一个项目中打开了大csv文件(大约700MB)。首先,我使用了xlsread
,但发现了它的一些限制(我无法打开文件包含超过100万行,这个功能需要很多时间)。所以我发现了非常有用的textscan
功能。这里的数据示例示例与您的示例类似:
我的csv示例:
11204226 736539.402697001 192.168.0.101 10.0321 1 1.1311 3.543 3 9
11204333 736539.402697002 192.168.0.102 10.0322 2 1.1312 3.543 3 9
11204444 736539.402697003 192.168.0.103 10.0323 3 1.1313 3.543 3 9
我的代码:
fileID = fopen('newfile.csv','r');
formatSpec1 = '%f%f%f%f%f%f%f%f%f%f%f';
A = textscan(fileID, formatSpec1,'Delimiter',{';'});
结果:A
是一个单元格数组。 A
的每个单元格都包含整列数据。
我们可以为IP地址做些什么?
我建议这样做:
myip = strcat( num2str(A{3}),'.',num2str(A{4}),'.',num2str(A{5}))
myip =
192.168.0.0.101
192.168.0.0.102
192.168.0.0.103
myip
是一个char数组。
那么保存所有这些数据呢?
我们可以将cell数组转换为double数组并删除ip列:
res = cell2mat(A);
res(:,3:5) = [];
立即保存:
save('test.mat','res','myip')
使用mat文件确实是个好主意,因为它现在由有用的数据类型组成,我们可以通过1次单击(或1行命令)加载它,并且它每次都比读取csv快得多。