【发布时间】:2011-04-18 14:25:54
【问题描述】:
引用和分配 matlab 数据集的子集似乎效率极低,并且可能像 rows^2 一样缩放
示例:
alldata 是一个包含混合数据的大型数据集 - 比如说 150,000 行乘 25 列(整数、布尔值和字符串)。
数据集的格式为:
'format', '%s%u%u%u%u%u%s%s%s%s%s%s%s%u%u%u%u%s%u%s%s%u%s%s%s%s%u%s%u%s%s%s%u%s'
然后我将 2 个整数类型转换为布尔类型
以下子集赋值:
somedata = alldata(1:m,:)
对于 m = 10,000 需要 >7 秒,而对于较大的 m 值则需要荒谬的时间。绘制时间与 m 显示了一种奇怪的 m^2 类型关系,因为复制所有数据几乎是瞬时的,就像使用 sortrows 和 find 之类的函数一样。事实上,读取原始的 .csv 数据文件比上面对大 m 值的赋值要快。
使用分析器,似乎有一个函数 subref 包含一条非常慢的行,用于检查字符串比较以确定数据集中的唯一值。这与数据集类型的存储方式(即参考表)有关吗?数据集包含大量唯一字符串值。
他们有什么解决方案可以在 matlab 中提取数据集的子集吗?例如预分配(如何?),或复制数据集并删除行而不是分配提取/子集。
我正在使用具有 1.5Gb 内存的双核机器,但任务管理器报告使用的内存少于 1Gb。
【问题讨论】:
-
您能给我们一个您的数据库的快照示例吗?只需几行,所有列都可以。
-
嗯——数据是……敏感的。它主要由一个观察 id、几个作为字符串保存的参考 id、几个日期字段(存储在字符串中,因为我还没有开始使用它们)、两个布尔列、几个整数字段(大多数单个整数)和一个一大堆其他字符串字段(通常少于 20-30 个字符。如果有帮助,我可以给你变量类型的实际序列?
-
以下是其他人遇到相同问题的示例:mathworks.com/matlabcentral/newsreader/view_thread/…