科学计算软件的托管语言
科学计算是算法密集型的,也可以是数据密集型的。在继续进行下一步之前,它通常需要使用大量内存来运行分析并释放它。有时它还会使用内存池为每个分析回收内存。托管语言在这里很有趣,因为它可以使开发人员专注于应用程序逻辑。由于可能需要处理庞大的数据集,因此性能也很重要。但是,我们如何使用托管语言来控制内存和性能呢?
解决方案
不太清楚问题是什么,但我们可能想看看堡垒
我们在问一个根本有缺陷的问题。托管语言的全部目的是我们不处理内存。这是由垃圾收集器处理的,尽管我们可以执行某些操作以更好地允许它以有效的方式完成其工作,但完成工作不是工作。
在性能不受我们控制的世界中,我们可以做的事情可以提高性能。确保我们没有保留不需要的参考。如果需要对情况进行更多控制,请使用基于堆栈的变量。
似乎有些针对此受众。实际上有一本书叫做Ffor科学家。
在Lambda the Ultimate上也有人问过这个问题。
我认为功能语言最适合此类任务。
使用托管语言,我们将无法轻松获得该控件。这些语言的重点是处理malloc,垃圾等。每种托管语言将对此进行不同的处理。
Perl内存不足时被认为是致命错误。我们可以使用$ ^ M通过一些小措施来节省一天的时间,但这仅在编译器已使用该功能编译并为其添加代码规定的情况下进行。
我们可能会对使用Matlab的人数感到惊讶,因为它可以被视为一种编程语言,并且可以管理自己的内存(支持庞大的数据集等),因此在这里应该认真考虑将其作为解决方案。
此外,它将生成程序代码(可能需要单独的插件?),因此一旦我们要打包的算法就可以让它生成C代码以执行我们最初在M脚本或者simulink模型中所做的工作。
-亚当
我想我想用一个问题来解释一个问题:.NET内存管理器是否能够处理科学计算的内存管理工作,而传统上手工调整的例程已用于改善内存性能,特别是对于非常大的(GByte)矩阵?
本文的作者当然认为这是:
利用Cto的功能为科学计算项目提供动力
正如其他人所指出的那样,托管代码的主要点是我们不需要自己处理内存管理任务。这是一个主要优点,因为它使我们可以专注于算法。
由于其开销,.NET应用程序相对于非托管应用程序将导致性能下降。但是,由于此开销几乎是与应用程序的整体大小无关的常数(警告:过于简化),因此,应用程序越大,开销就越小。
因此,我会选择.NET(只要它为我们提供了所需的库)。管理内存是一件很痛苦的事情,我们必须做很多事情才能擅长于此。在.NET中,请选择最适合语言,只要它不是Jor VB.NET且是C#。
最近,Python在科学计算中已经变得非常重要。这是一种托管语言,因此我们不必记住要释放内存。同时,它具有用于科学和数值计算的软件包(NumPy,SciPy),可为我们提供与编译语言相似的性能。另外,Python可以很容易地与C代码集成。
Python是一种非常具有表现力的语言,与许多传统语言相比,它更易于编写和阅读。在某些方面,它也与MATLAB类似,与C ++或者Fortran相比,它使科学家更容易使用。
奥斯陆大学最近开始将Python作为信息学系以外仍在学习Java的所有理科学生的默认语言进行教学。
Simula研究实验室在科学计算,偏微分方程等方面投入大量精力,广泛使用python。
由Oberon microsystems开发的BlackBox Component Builder是用于编程语言Component Pascal的基于组件的开发环境。
由于其稳定性,性能和简单性,BlackBox非常适合科学和工程应用。
http://www.oberon.ch/blackbox.html
(公开:我为Oberon微系统工作)
问候,
坦贝格
最好的选择是带有NumPy / SciPy / IPython的Python。它具有出色的性能,因为核心数学正发生在以高度优化的C和Fortran编写的库中。由于我们使用Python与之互动,因此从角度来看,所有内容都是干净的,并通过非常简洁,可读的代码和垃圾回收进行管理。
简短的答案是,我们可以通过选择合适的语言(例如OCaml或者F#)并学习如何在该语言中进行优化来控制以托管语言编写的程序的内存和性能。长答案需要一本有关我们正在使用的特定语言的书,例如用于科学家的OCaml或者用于技术计算的Visual F2010.
我们需要学习的主题是算法优化,低级优化,数据结构以及所选语言中类型的内部表示。如果我们正在编写并行算法,那么了解缓存也特别重要。

