我有一个非常长的字符串,我想找到所有的NaN值并将其替换为'Null'。这个长字符串是从120 x 150000单元格转换而来的。将它转换为长字符串的原因是我要将它转换为一个巨大的SQL查询,因为fastinsert和datainsert可能非常慢,有时候我的堆空间已经用完了。想法是做以下
exec(sqlConnection, long_string)
我尝试使用regexpreop将NaN替换为null,但似乎非常慢。有替代方法吗?
long_string = regexprep(long_string,'NaN','null');
答案 0 :(得分:5)
正如Floris所说,regexp
是一个非常强大的命令,因此比其他查找命令慢。
除了Floris建议,您可以尝试使用适用于您案例的strrep
,因为您没有使用regexp
的任何特殊权力。
以下是一个例子:
str = char('A' + rand(1,120 * 15000)*('z'-'A'));
tic
str2 = strrep(str, 'g', 'null');
disp('strrep: '), toc
tic
str3 = regexprep(str, 'g','null');
disp('regexprep: '), toc
在我的电脑上它会返回:
strrep:
Elapsed time is 0.004640 seconds.
regexprep:
Elapsed time is 4.004671 seconds.
答案 1 :(得分:2)
regex
非常强大,但由于其灵活性,可能会很慢。如果你仍然有原始的单元格数组 - 假设它只包含字符串 - 下面的代码行应该可以工作,并且非常快:
cellArray{find(ismember(cellArray,'NaN'))} = 'null';
ismember
找到cellArray
中NaN
的所有元素,返回一个与cellArray
形状相同的布尔数组; find
操作会将这些操作转换为NaN
元素的索引,然后您只需将值null
分配给所有元素。
必须说120 x 150,000是一个非常大的单元阵列 - 即使每个单元中只有一个字符,它也会占用2 GB以上(我知道这是因为我刚创建了一个120x15000的单元阵列,它是205,500,000字节)。可能值得在较小的块中处理它,而不是一次性处理。特别是如果您知道NaN
仅在某些列中出现,例如。
处理一个GB大小的字符串,特别是当你不能就地操作时(你在每次更换时改变字符串的大小,而且它变得更长,而不是更短)将会变慢。如果你真的没有其他选择,你可以编写一个简短的mex
函数来实现这一点 - 这可能非常快。