【问题标题】:Linux vs. Windows execution of lsqcurvefit and importdata in MatLabLinux 与 Windows 在 MatLab 中执行 lsqcurvefit 和 importdata
【发布时间】:2014-03-28 15:41:21
【问题描述】:

我最近在 MatLab 中编写了一个程序,该程序严重依赖于 MatLab 的“importdata”函数和优化工具箱中的“lsqcurvefit”函数。在 Windows 中使用 MatLab R2011b 执行此代码大约需要 15 秒。当我将代码转移到 Linux (CentOS) 机器上时,大约需要 30 分钟。

使用 Profile 工具,我确定大部分额外计算时间都花在了“importdata”函数和“lsqcurvefit”函数上。我清除了两个环境中的所有变量,并使用“importdata”在两个环境中导入了相同的数据文件。在 Linux 中,这需要约 5 秒,而在 Windows 中,这需要约 0.1 秒。

有没有办法解决这个问题?代码在 Linux 中快速运行是绝对必要的。 Linux机器的内存和处理速度都远超Windows机器。在做了一些阅读之后,我尝试增加 Java 堆内存,但这没有效果。

【问题讨论】:

  • 您是在同一台机器上运行双启动,还是在两台不同的计算机上运行?我遇到了类似的情况,我们公司集群上的代码运行速度慢了 10-20 倍,结果证明是因为集群是基于AMD processors 构建的。尝试从每个平台的命令行运行bench
  • 两台机器上的驱动器设置是否相同?您是从两者上的本地驱动器读取文件,还是通过 NFS 或 SMB 的网络驱动器读取文件?我在旧版本的 Matlab 上遇到了几个病态案例,其中在网络驱动器上进行保存/加载很粗糙(通过在本地文件系统上制作临时副本来解决)或者从文件管理器导出的 NFS 存在一些病态行为,主要是CIFS,或病毒扫描程序与网络文件系统等的交互等等。你能给我们一些关于两台机器设置的更多细节吗?
  • craigim: 我从两台机器的命令行运行“bench”:Linux 机器在除 3D 之外的所有类别中都优于 Windows 机器。 Andrew: 我相信数据存储在网络驱动器上,但计算机运行的是最新版本的 MatLab。 Windows 机器是个人计算机,而 Linux 机器与我实验室的服务器联网。我会按照您的建议尝试在本地存储输出,然后回复您。
  • 显然用 'dlmread' 替换 'importdata' 解决了这个问题。不知道为什么,但“dlmread”在 Linux 上要快得多。感谢您的帮助!

标签: linux matlab


【解决方案1】:

importdata 本身实际上只是一个包装器,它调用各种其他函数 - 例如,xlsread - 取决于输入数据的类型。由于它需要多种类型的文件作为输入(您甚至可以使用它加载图像,尽管为什么要这样做是另一回事),它需要确定文件是什么,然后调用相应的函数。

另一方面,dlmread 只接受特定类型的文件(ASCII 分隔的数字)。

简而言之: 当您可以使用更具体的功能时,切勿使用像importdata 这样一刀切的功能。可以看到文件格式列表和具体的读/写函数here

我也不认为这仅限于 Linux。一千次重复,在 Windows 机器上加载一个小制表符分隔的文件:

dlmread : 0.756655 秒

csvread:1.332842 秒

importdata:69.508252 秒

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 2020-05-17
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多