【问题标题】:strcmp files - Very large file size outputstrcmp 文件 - 非常大的文件大小输出
【发布时间】:2014-04-15 20:30:53
【问题描述】:

我正在读取一个大约 80MB 的 csv 文件 - data_O3。它的大小约为 250,000 x 5。我创建了E,它有点大,因为它有所有的日子(data_O3 缺少一些日子)。我想比较两者,如果日期(保存在变量d3)和站点ID(d4)相同,则数据点(第5列)放在E中。

for j = 1:size(data_O3,1) 
    E(strcmp(d3,data_O3{j,3})&d4 == data_O3{j,4},5) = data_O3(j,5);
end

此脚本运行良好,但由于某种原因,运行它所需的时间比预期的要长。我已经为其他数据运行了相同的代码,这些数据只是稍微小一点,没有问题。这是strcmp 代码的问题还是其他问题?

使用的脚本和文件可以在这里找到:https://www.dropbox.com/sh/7bzq3m1ixfeuhu6/i4oOvxHPkn

【问题讨论】:

  • strcmp 返回逻辑 0 或 1,因此它写入 E(0,5) 或 E(1,5)... 并且“0”不是有效索引。我认为这段代码没有你想象的那么“有效”。
  • 您可以在strcmp 中传播&d4 以节省一点?
  • @BenVoigt 它不能通过二进制索引工作吗?
  • @BenVoigt E(false,5) 没什么问题,它只是返回一个空矩阵。有趣的是,您可以将它用作左值,它在赋值中什么也不做。很奇怪吧?
  • 我没有意识到您可以混合使用逻辑索引和数字索引,但我刚刚找到了一个说明您可以的参考。

标签: matlab strcmp


【解决方案1】:

当然有很多方法可以显着加快速度。

首先,以数字形式读入所有数字数据。 Matlab 没有针对字符串进行优化,甚至通常应尽可能避免使用单元格。如果您想将所有内容都保留为字符串,请使用另一种语言(python 或 perl)

将州、县和站点读取为数字后,然后为 siteID 创建一个数字而不是字符串。一种方法是使用以下公式:

siteID = siteNum + 1e4*countyCode + 1e7*stateCode

这将为所有网站生成唯一的站点 ID。

使用 datenum 将日期字段转换为数字。

您现在处于第 79 行定义的 data_O3 可以是纯数字数组(没有单元格!)的位置,您的 E 矩阵也可以。仅此一项就会使该过程快很多倍。

您可能还想将 E 定义为 NaN 以外的其他值。也许给它 -1 的值。

在比较中您可以做更多的优化,但先做上面的,我希望您会看到巨大的改进。

【讨论】:

  • 你能提供更多细节吗?其实我对编码还是比较陌生的。我已经将日期作为日期编号。如果您可以查看我发布的文件并展示我将如何检测丢失的日期,那就太好了。我需要匹配 SiteID 以及日期列,因为该文件有很多不同的站点,并且每个站点都有一年的数据。
  • 刚开始的时候没有看到数据,所以做了错误的假设。我现在将删除答案。
  • 我按照您的建议做了一切,但仍然需要很长时间。我不知道这是否有很大的不同。你知道为什么输出它比进入它的 80MB 文件大这么多吗?
  • 能否将data_O3数组和E数组保存在mat文件中并提供它们,然后提供更新后的代码?
  • 我将新脚本 (Readin_MDA8_O3_US_1990_2014_cell1.m) 和 .mat 文件与您要求的内容添加到上面的 Dropbox 链接中。 data_O3_output.mat 是 mat 文件。 data_O3 是单元格,data_O3_mat 是全双矩阵。 E 除了最后一列之外的所有列都已填写,这是我试图与之比较以填充的数据。如您所见,这些文件一点也不大。但是从代码的第 108 行(strcmp 部分)开始,脚本变得非常慢并且输出变得巨大。
猜你喜欢
  • 2017-04-29
  • 2021-06-15
  • 1970-01-01
  • 2017-06-21
  • 2017-02-15
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多