我正在尝试使用textscanMATLAB 分析一个非常大的文件.有问题的文件大小约为12 GB,包含大约2.5亿行,每行有7个(浮动)数字(由空格分隔); 因为这显然不适合我桌面的RAM,我正在使用MATLAB文档中建议的方法(即一次加载和分析文件的一个较小的块.根据文档,这应该允许处理"任意大分隔文本文件[s]").这只允许我扫描大约43%的文件,之后文本扫描开始返回空单元格(尽管仍有数据留在文件中扫描).
为了调试,我尝试使用该fseek函数转到文件中的多个位置,例如:
fileInfo = dir(fileName);
fid = fileopen(fileName);
fseek(fid, floor(fileInfo.bytes/10), 'bof');
textscan(fid,'%f %f %f %f %f %f %f','Delimiter',' ');
Run Code Online (Sandbox Code Playgroud)
我假设我在fseek这里使用的方式将位置指示器移动到我文件的大约10%.(我知道这并不一定意味着该指标是在一行的开头,但如果我跑textscan两次,我得到一个满意的答案.)现在,如果我取代fileInfo.bytes/10的fileInfo.bytes/2(即它移动到文件的大约50%一切都崩溃了,textscan只返回一个空的1x7单元格.
我使用文本编辑器查看了大文件的文件,这表明整个文件看起来很好,并且没有理由textscan混淆.我能想到的唯一可能的解释是,在我不太了解的更深层次上出现问题.任何建议将不胜感激!
编辑
我的代码的相关部分过去看起来像这样:
while ~feof(fid)
data = textscan(fid, FormatString, nLines, 'Delimiter', ' '); %// Read nLines
%// do some stuff
end
Run Code Online (Sandbox Code Playgroud)
首先,我尝试使用ftell并fseek按照Hoki的建议进行修复.这给出了与之前完全相同的错误:MATLAB无法读取超过大约43%的文件.然后我尝试使用HeaderLines解决方案(也在下面建议),如下所示:
i = 0;
while ~feof(fid)
frewind(fid)
data = textscan(fid, FormatString, nLines, …Run Code Online (Sandbox Code Playgroud) 据我所知,XON 和 XOFF 只是用于两个串行设备之间握手的特殊 ASCII 字符。但我不清楚当我使用这种类型的流量控制进行通信时实际会发生什么。我的消息开头是否只有一个 XON 字符,末尾有一个 XOFF 字符?即,当我使用PySerial编写如下内容时:
import serial
ser = serial.Serial('COMx', 9600, xonxoff = True)
ser.write('Hi!\r\n')
Run Code Online (Sandbox Code Playgroud)
设备是否确实收到此信息:
\x11Hi!\r\n\x13
Run Code Online (Sandbox Code Playgroud)
(\x11分别是Python 中的\x13XON 和 XOFF 字符。)或者还有其他事情发生吗?(遗憾的是,随着PortMon 的消亡,我自己没有一个简单的方法来测试这一点。)
在 APL 中,可以使用 构造广义内积f.g。根据手册,结果是一个数组,其中每个项目都是根据左操作数和右操作数的向量构造的f/x g\xc2\xa8y(x并且y是沿着所述操作数的特定轴获取的向量)。乍一看,外部产品似乎源自于此:它是\xe2\x88\x98.g,我通过设置 获得它f \xe2\x86\x90 \xe2\x88\x98。但是,如果我使用内积的定义来评估它,我似乎没有获得有效的 APL 代码(我得到了\xe2\x88\x98/x g\xc2\xa8y,其中\xe2\x88\x98/特别没有多大意义)。
这两个运算符是否与引擎盖下的某些魔法有关,或者\xe2\x88\x98.只是被解释为与内积无关的不同运算符?