Python 在MATLAB中以矩阵形式加载文本文件

Python 在MATLAB中以矩阵形式加载文本文件,python,matlab,text-files,Python,Matlab,Text Files,我有一个文本文件,它是一个庞大的数据集(大约9GB)。我已将文件安排为244x3089987,数据用制表符分隔。我想在Matlab中加载这个文本文件作为矩阵。这是我尝试过的,但没有成功(我的Matlab被挂起) 我做错了什么,还是我的方法错了?如果这在Python中很容易实现,请有人提出相应的建议 试试看: A=importdata('merge.txt','\t') 如果行不是由'\n'分隔的: [C,剩余]=vec2mat(A,244) 试试: A=importdata('merge.tx

我有一个文本文件,它是一个庞大的数据集(大约9GB)。我已将文件安排为244x3089987,数据用制表符分隔。我想在Matlab中加载这个文本文件作为矩阵。这是我尝试过的,但没有成功(我的Matlab被挂起)

我做错了什么,还是我的方法错了?如果这在Python中很容易实现,请有人提出相应的建议

试试看:
A=importdata('merge.txt','\t')

如果行不是由
'\n'
分隔的:
[C,剩余]=vec2mat(A,244)

试试:
A=importdata('merge.txt','\t')

如果行不是由
'\n'
分隔的:
[C,剩余]=vec2mat(A,244)


如果您阅读了的文档,您将看到您可以定义一个输入参数
N
,以便:

textscan使用formatSpec读取文件数据N次,其中N是 正整数。在N之后从文件中读取其他数据 循环后,使用原始文件ID再次调用textscan。如果你恢复工作 通过使用相同的文件标识符调用textscan对文件进行文本扫描 (fileID),然后textscan会自动在该点恢复读取 它终止了最后一次读取

您还可以将空白的
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);
这将读取10行块,直到到达文件末尾

如果您有足够的RAM来存储数据(一个
244x3089987
double
数组刚好超过6千兆位),那么您可以执行以下操作:

mydata = textscan(fID, '', 'Delimiter', '\t', 'CollectOutput', true);
mydata = mydata{1}; % Pull data out of cell array. Can take time for large arrays

如果您阅读了的文档,您将看到您可以定义一个输入参数
N
,以便:

textscan使用formatSpec读取文件数据N次,其中N是 正整数。在N之后从文件中读取其他数据 循环后,使用原始文件ID再次调用textscan。如果你恢复工作 通过使用相同的文件标识符调用textscan对文件进行文本扫描 (fileID),然后textscan会自动在该点恢复读取 它终止了最后一次读取

您还可以将空白的
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);
这将读取10行块,直到到达文件末尾

如果您有足够的RAM来存储数据(一个
244x3089987
double
数组刚好超过6千兆位),那么您可以执行以下操作:

mydata = textscan(fID, '', 'Delimiter', '\t', 'CollectOutput', true);
mydata = mydata{1}; % Pull data out of cell array. Can take time for large arrays

我很惊讶,当我尝试类似的文本扫描抛出错误时,它甚至试图运行

如果你真的想使用textscan,你只需要每行的格式,这样你就可以用1替换代码中的244,这样就可以了。编辑:已经阅读了您的注释,而不是第一个元素中的列数,因此您应该执行
formatString=repmat(“%f',1244”)。另外,您显然可以将格式保留为空(
'
),这样它就可以工作了

然而,Matlab有几个例子,其中文本扫描很少是最简单的方法

在这种情况下,我可能会使用,它不需要任何限定的数值数据。你想要的是:

C=dlmread('merge.txt', '\t');

此外,当你试图加载9GB的数据时,我假设你有足够的内存,如果你不需要的话,你可能会有一个内存不足的错误,但是这是一个值得考虑的问题。

< P>我很惊讶,这甚至是在尝试运行,当我尝试类似的东西时,TeTSCAN会抛出一个错误。 如果你真的想使用textscan,你只需要每行的格式,这样你就可以用1替换代码中的244,这样就可以了。编辑:已经阅读了您的注释,而不是第一个元素中的列数,因此您应该执行
formatString=repmat(“%f',1244”)。另外,您显然可以将格式保留为空(
'
),这样它就可以工作了

然而,Matlab有几个例子,其中文本扫描很少是最简单的方法

在这种情况下,我可能会使用,它不需要任何限定的数值数据。你想要的是:

C=dlmread('merge.txt', '\t');

此外,当你试图加载9GB的数据时,我假设你有足够的内存,如果你不需要的话,你可能会有一个内存不足的错误,但是这是一个值得考虑的问题。

< P>最近的Matlab版本中的另一个选项是使用<代码>数据存储< /代码>。这样做的好处是,它允许您翻阅数据,而不是一次读取全部数据。它通常可以推断出所有的格式化内容


在最近的MATLAB版本中,另一个选项是使用
数据存储
。这样做的好处是,它允许您翻阅数据,而不是一次读取全部数据。它通常可以推断出所有的格式化内容


你的问题不清楚。什么是不成功的?您是否遇到内存错误或根本没有读取数据?首先,
formatSpec
更容易定义为每行(以
\r\n
结尾),而不是整个文件。我的matlab被挂起,我不得不一直强制退出。我等了大约2个小时,因为有一些错误,但它总是挂起。这可能是你的问题中包含的重要信息,你不认为吗?是的,你能帮我吗?我能在这里做什么?这完全取决于你打算如何使用这些数据。您需要一次加载所有数据吗?还是可以分块处理数据?如果你需要全部加载,你需要有足够的内存。你的问题不清楚。什么是不成功的?您是否遇到内存错误或根本没有读取数据?首先,
formatSpec
更容易定义为每行(以
\r\n
结尾),而不是整个文件。我的matlab被挂起,我不得不强制退出所有