5

科学计算是算法密集型的,也可能是数据密集型的。它通常需要使用大量内存来运行分析并在继续下一个之前释放它。有时它还使用内存池为每次分析回收内存。托管语言在这里很有趣,因为它可以让开发人员专注于应用程序逻辑。由于它可能需要处理庞大的数据集,因此性能也很重要。但是我们如何使用托管语言来控制内存和性能呢?

4

12 回答 12

10

Python最近在科学计算领域变得相当大。它是一种托管语言,因此您不必记住释放内存。同时,它具有科学和数值计算包(NumPySciPy),可以为您提供类似于编译语言的性能。此外,Python 可以很容易地与 C 代码集成。

Python 是一种表达能力很强的语言,它比许多传统语言更容易编写和阅读。它在某些方面也类似于 MATLAB,比 C++ 或 Fortran 更易于科学家使用。

奥斯陆大学最近开始向信息学系以外的所有理科学生(仍在学习 Java)教授 Python 作为默认语言。

专注于科学计算、偏微分方程等的Simula 研究实验室广泛使用 python。

于 2008-09-24T07:18:30.123 回答
6

你在问一个根本有缺陷的问题。托管语言的全部意义在于您不处理内存。这是由垃圾收集器处理的,虽然您可以采取某些措施来更好地让它以有效的方式完成其工作,但完成它的工作不是您的工作。

在一个性能不受您控制的世界中,您可以做些什么来提高性能,这很简单。确保你不要持有你不需要的参考资料。如果您需要对情况进行更多控制,请使用基于堆栈的变量。

于 2008-09-24T05:17:17.187 回答
5

F# 似乎有点针对这些受众。实际上有一本书叫F# 给科学家

在 Lambda the Ultimate 上也有人问过这个问题。

于 2008-09-24T05:19:06.667 回答
5

您可能会对为此使用 Matlab 的人数感到惊讶,因为它可以被视为一种编程语言,并且当然可以管理自己的内存(支持巨大的数据集等),因此在这里应该认真考虑将其作为一种解决方案.

此外,它会生成程序代码(可能需要一个单独的插件?),所以一旦你找到一个你想要打包的算法,你就可以让它生成 C 代码来执行你最初​​在 M 脚本或 simulink 模型中所做的工作。

-亚当

于 2008-09-24T05:25:34.780 回答
3

不完全确定问题是什么,但您可能想查看Fortress

于 2008-09-24T05:15:27.907 回答
2

我想我会通过说.NET 内存管理器能够处理科学计算的内存管理工作来解释这个问题,而传统的手动调整例程已被用于提高内存性能,特别是对于非常大(GByte)的矩阵?

这篇文章的作者当然相信它是: Harness the Features of C# to Power Your Scientific Computing Projects

正如其他人所指出的,托管代码的一个重点是您不需要自己处理内存管理任务。这是一个主要优势,因为它可以让您专注于算法。

于 2008-09-24T05:39:58.847 回答
1

最好的选择是带有 NumPy/SciPy/IPython 的 Python。它具有出色的性能,因为核心数学发生在用高度优化的 C 和 Fortran 编写的库中。由于您使用 Python 与它进行交互,因此从您的角度来看,一切都是干净的,并且通过极其简洁、可读的代码和垃圾收集进行管理。

于 2008-09-24T14:25:14.000 回答
1

由 Oberon microsystems 开发的 BlackBox Component Builder 是编程语言“Component Pascal”的基于组件的开发环境。

由于其稳定性、性能和简单性,BlackBox 非常适合科学和工程应用。

http://www.oberon.ch/blackbox.html

(披露:我为 Oberon 微系统工作)

问候,坦伯格

于 2008-09-24T14:17:49.383 回答
1

我认为函数式语言最适合这种类型的任务。

于 2008-09-24T05:22:14.490 回答
1

简短的回答是,您可以通过选择合适的语言(如OCamlF#)并学习如何优化该语言来控制以托管语言编写的程序的内存和性能。长答案需要一本关于您正在使用的特定语言的书,例如OCaml for ScientistsVisual F# 2010 for Technical Computing

您需要学习的主题是算法优化、低级优化、数据结构和所选语言中类型的内部表示。如果您正在编写并行算法,那么了解缓存也特别重要。

于 2009-07-31T15:42:46.810 回答
0

使用托管语言,您不会那么容易获得这种控制。这些语言的重点是处理 malloc、垃圾等。每种托管语言都会以不同的方式处理它。

Perl 内存不足被认为是致命错误。您可以使用 $^M 通过一些小措施来节省一天的时间,但这仅在您的编译器已使用该功能编译并为其添加代码规定的情况下。

于 2008-09-24T05:23:58.340 回答
0

由于它的开销,.NET 应用程序将导致相对于非托管应用程序的性能损失。然而,因为这个开销或多或少是一个与应用程序的整体大小无关的常数(警告:过度简化),所以应用程序越大,它的惩罚就越小。

所以我会选择.NET(只要它为您提供所需的库)。管理记忆是一件痛苦的事,你必须做很多事情才能擅长它。在 .NET 中,选择您最熟悉的任何语言,只要它不是 J# 或 VB.NET 而是 C#。

于 2008-09-24T05:49:32.397 回答