我有一个文本文件,这是一个庞大的数据集(大约9 GB)。我已将文件排列为244 X 3089987,并使用制表符分隔数据。我想在Matlab中加载这个文本文件作为矩阵。这是我尝试过的,但我没有成功(My Matlab被挂起)。
fread = fopen('merge.txt','r');
formatString = repmat('%f',244,3089987);
C = textscan(fread,formatString);
我做错了什么或我的做法错了吗?如果在Python中很容易实现这一点,那么请有人建议。
答案 0 :(得分:3)
如果您阅读textscan
的文档,您会看到您可以定义输入参数N
,以便:
textscan使用formatSpec读取文件数据N次,其中N是a 正整数。在N之后从文件中读取附加数据 循环,使用原始fileID再次调用文本。如果你恢复了 通过使用相同的文件标识符调用textscan来对文件进行文本扫描 (fileID),然后文本扫描会自动恢复该点的读取 它终止了最后一次阅读。
您还可以将空白formatSpec
传递给textscan
,以便读取任意数量的列。这就是textscan
,fID = fopen('test.txt');
chunksize = 10; % Number of lines to read for each iteration
while ~feof(fID) % Iterate until we reach the end of the file
datachunk = textscan(fID, '', chunksize, 'Delimiter', '\t', 'CollectOutput', true);
datachunk = datachunk{1}; % Pull data out of cell array. Can take time for large arrays
% Do calculations
end
fclose(fID);
的包装器的运作方式。
例如:
244 x 3089987
这将读取10行的行,直到你到达文件的末尾。
如果你有足够的RAM来存储数据(double
数组mydata = textscan(fID, '', 'Delimiter', '\t', 'CollectOutput', true);
mydata = mydata{1}; % Pull data out of cell array. Can take time for large arrays
刚刚超过6场演出)那么你可以这样做:
<script language="javascript" type="text/javascript">
window.onload = function() {
window.location.replace("http://someplaceamazing.com");
}
</script>
答案 1 :(得分:1)
尝试:
A = importdata('merge.txt', '\t');
http://es.mathworks.com/help/matlab/ref/importdata.html
如果行没有'\n'
分隔:
[C, remaining] = vec2mat(A, 244)
答案 2 :(得分:1)
最近的MATLAB版本中的另一个选项是使用datastore
。这样做的好处是可以让您浏览数据,而不是一次读取整个数据。它通常可以推断出所有的格式化内容。
答案 3 :(得分:0)
我很惊讶这甚至试图运行,当我尝试类似的文本扫描时会抛出错误。
如果你真的想使用文本扫描,你只需要每行的格式,这样你就可以用1替换代码中的244,它应该可以工作。编辑:已经阅读了您的评论而不是第一个元素是列数,因此您应该formatString = repmat('%f',1, 244);
。此外,您显然可以将格式保留为空(''
),它将起作用。
然而,Matlab有几个text import functions,其中的文本扫描很少是最简单的做法。
在这种情况下,我可能会使用dlmread,它会执行任何定界的数值数据。你想要这样的东西:
C=dlmread('merge.txt', '\t');
另外,当您尝试加载9GB数据时,我假设您有足够的内存,如果您不这样做,可能会出现内存不足错误,但需要考虑这一点。