JavaScript和科学处理?

26

Matlab、R和Python都是很强大的工具,但对于我想要做的一些数据挖掘工作来说,有些成本高或速度较慢。我考虑使用Javascript,因为它既有快速、好的可视化库,又可以使用浏览器作为界面。

我面临的第一个问题是科学编程中显而易见的问题,如何对数据文件进行I/O操作?第二个问题是客户端还是服务器端?最后一个问题是,我能否制作出真正的可移植性,即将所有内容放在USB上并从中运行?

我花了几周时间寻找答案。Server2go似乎可以满足客户端/服务器需求,这意味着我可以在客户端与程序之间传输数据。Server2go还允许从USB运行。我处理的数据文件通常是XML格式的,而且似乎有几个javascript转换器可以将XML转换为JSON格式。

然而,在所有的寻找过程中,我不确定我的方法是否合理。所以,在我进一步投入之前,对于Javascript作为科学数据处理的可移植工具,有什么建议、想法或指导吗?


7
我强烈建议不要在科学处理中使用JavaScript。它缺乏数学库、内存管理和强类型支持。 - Alberto De Caro
1
我同意,对于以科学标准进行数学运算的支持相当不足。 - OrangeDog
@larsmans 我只是从 JavaScript 与 C++ 的性能对比角度来看待这些基准测试。虽然 Python 没有被慢到所说的那么夸张,但它仍然要慢得多。 - MikeB
@ ADC 我认为内存管理和类型方面的担忧并不是阻碍因素;许多语言都存在这样的问题,例如Matlab :) 我觉得这种越来越普及的语言没有得到更多的科学支持令人困惑。我越学习它,它就显得越强大。话虽如此,我已经找到了矩阵数学、物理、统计学、信号处理、机器学习等领域的库,所以它似乎很有前途。 - MikeB
4
你确定 JavaScript 的运行速度具有可比性吗?特别是在涉及数学和矩阵运算时,很难击败能够使用 Fortran 库的工具,例如 R 和 numpy。 - Has QUIT--Anony-Mousse
1
@MikeB:我已经联系了Julia开发人员关于Python基准测试的问题。JavaScript与C++的比较是否公平取决于您想要运行的算法;如果它们在矩阵乘法方面花费了很多时间,那么你就会遇到麻烦。 - Fred Foo
3个回答

12

我同意JavaScript并不适合科学计算的评论。但是,你最了解自己的需求,可能已经找到了有用的库来完成你需要的工作。只是要注意,你将不得不自己实现所有逻辑。JavaScript没有内置的处理复数、矩阵或积分等复杂数学运算的功能。通常程序员的时间比机器时间更有价值。个人而言,我会考虑编译语言;在我使用最喜欢的语言创建了第一个速度不够快的版本之后再考虑。

假设JavaScript是正确的选择:

数据输入/输出

我能想到三种选项:

使用ajax将数据发送和接收到服务器

这似乎是你在Server2go中找到的解决方案。它要求你编写一个服务器后端,但可以保持相当简单。它实际上只需要能够读取和写入文件以响应于你客户端应用程序的请求就可以了。

使用包含文件I/O的v8的非浏览器实现

例如Node.js。然后你可以避免需要一个服务器,只需使用命令行界面,所有代码都将是JavaScript。除此之外,它与第一种选项大致相同。

使用文件API创建一个文件对象,然后要求用户保存或加载它

在我看来,这是最差的选择,因为需要用户交互。它可以避免需要服务器;你的应用程序可以是一个简单的HTML文件,通过ajax请求加载所有数据文件。你需要使用特殊开关启动Chrome,以允许ajax请求使用file://协议,详见这里

这些选项仅涉及文件I/O,而JavaScript无法执行文件I/O操作。这是因为浏览器不能允许任意的Web代码进行任意的文件I/O操作,安全问题会非常严重。每个选项介绍了一种不进行文件I/O操作的方法。

第一个选项是与执行客户端文件I/O操作的服务器通信。

第二个选项使用“特殊”版本的JavaScript,具有不同于浏览器的条件,因此安全影响不重要。但这意味着您必须查找实际使用的实现中如何进行文件I/O操作,这在JavaScript中并不常见。

第三个选项需要用户控制文件I/O。

界面

即使您不使用JavaScript来执行实际处理(目前是共识),也没有阻止您使用浏览器作为接口或使用JavaScript库进行可视化。这是JavaScript擅长的事情。

如果您想交互式地控制数据挖掘工具,则需要一个可以控制该工具的服务器。Server2go应该可以使用,或者如果您使用Node.js则可以使用内置的服务器...。如果您不需要交互式控制数据工具,即首先生成处理后的数据,然后查看数据,可以通过使用file//:协议和JSONP来避免使用服务器。但是,真正的目标不应该是避免使用服务器。

我不会详细介绍界面问题,因为没有什么具体的要说的,而且几乎关于JavaScript编程的所有内容都与界面有关。

其中一件事,请使用像Angular.jsKnockout.js这样的声明式数据绑定库。


你应该添加一条注释,指出Node.js也需要客户端前端。当然,在服务器端处理数据是一个优势。 - Bergi
@Bergi 我其实从未使用过 Node.js。我认为它会提供某种命令行界面,这意味着没有必要使用客户端接口。除非你真的想看到输出结果... - Odalrick
@Odalrick,非常感谢你的回复。我认为文件I/O是使我感到最困惑的一点。我已经成功使用server2go,但这并不等同于理解实际发生的事情。Node.js 对我来说仍然有些神秘,而且我认为它不能从USB密钥运行。 - MikeB
@MikeB 我更新了答案,更详细地解释了为什么文件I/O是这样的。至于Node.js on a stick;我不确定,但安装页面描述了在Windows上手动安装的过程是将一个exe文件放在某个地方,然后就完成了。没有理由不能把“某个地方”设置为一个USB存储设备。对于*nix和Mac系统,您可能需要编译它,但之后同样适用“一个可执行文件,您就完成了”的方式。 - Odalrick
一定要运行一些实验,比较你的JavaScript应用程序与其他程序的性能。很容易出现性能上的差异! - Has QUIT--Anony-Mousse
显示剩余2条评论

11

JavaScript的速度被高估了。这是一个Web2.0的神话。

让我来解释一下这个说法(不要仅仅因为我说了你不想听到的东西就给我点反对!)

当然,JavaScript V8是一个非常高度优化的VM。它在原生基准测试中击败了许多其他脚本语言。

然而,它是一个非常有限的范围语言。它适用于Web世界中的“ADHS世界”。它是最佳尝试,但它可能会失败,并且您对完成或按时完成事物的保证很少。

例如考虑MongoDB。起初它似乎很好、很快并且提供了很多功能。直到你发现例如MapReduce只能单线程处理,从而变得非常慢。不是所有闪闪发光的东西都是金子!

现在看看与数据挖掘相关的库,例如BLAS。基本的线性代数、数学运算等等。所有CPU制造商如Intel和AMD都为其CPU提供了优化版本。这是一种优化,需要详细了解各个CPU,远远超出我们当前编译器的能力范围。这些库包含各种CPU的优化代码路径,实际上都执行相同的操作。对于这些操作,使用优化库(如BLAS)很容易获得5-20倍的速度提升;同时,通常在O(n^2)或O(n^3)中的矩阵运算将主导您的整个运行时。

因此,一个适用于数据挖掘的好语言将让您全部转向机器码!

Python的SciPy和R是很好的选择。它们内部具备优化库,并且易于使用较简单的语言进行包装处理。

看一下这个编程语言基准测试:

http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html

纯JavaScript具有很高的方差,意味着它可以快速处理一些东西(主要是正则表达式!),而其他一些东西则会慢得多。 它可以明显地击败PHP,但显然会被C和Java击败。

多线程对于现代数据挖掘也非常重要。今天很少有大型系统只有一个核心,你需要使用所有核心。因此,您需要具有强大的多线程操作的库和编程语言。这实际上是Fortran和C在这里失去流行性的原因。其他语言,如Java,在这方面更加优秀。


优秀的文章。我注意到JavaScript的差异性与PhP、Python和Ruby相当或更小。平台特定的库对于可移植应用程序来说是一种负担,这正是我所关注的。当我绘制Fortran、C++、Java 7 _server_、Lua、Ruby、PhP和Python时,JavaScript在慢速和快速之间的性能表现有点类似于桥梁。对于如此便携的东西来说,这是一个吸引人的利基市场。不过你说得对,任何大数据量的数字计算最好在定制的硬件/软件组合上完成。但是对于可移植性而言,JavaScript仍然似乎是最佳选择。 - MikeB
不要字面上看待基准测试结果。如果你仔细观察,会发现有些情况下Java代码本质上是通过JNI调用C库(难怪它无法击败C语言)。实际上,许多C程序将反过来调用Fortran子程序。 - Has QUIT--Anony-Mousse

4
尽管这个讨论有点陈旧,而且我并不是JavaScript大师,但我认为上述论点对于没有处理速度或先进数学运算能力的怀疑是不合理的。WebGL是一个JavaScript API,用于渲染依赖于先进数学运算的高级2D和3D图形。我相信从技术角度来看,这些能力已经存在了,但缺乏处理统计分析、自然语言处理和数据挖掘中包含的其他预测性分析的良好库。
WebGL基于OpenGL,后者又使用像BLAS(库信息here)这样的库。
像node.js、w8这样的新技术使其在技术上成为可能。缺少的是像R和Scilab中可以找到的库来执行相同的操作。

您可能会觉得 math.js 是一个有趣的倡议。 - Jos de Jong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接