【问题标题】:Javascript and Scientific Processing? [closed]Javascript和科学处理? [关闭]
【发布时间】:2012-07-23 23:08:41
【问题描述】:

Matlab、R 和 Python 功能强大,但对于我想做的一些数据挖掘工作来说要么成本高昂,要么速度慢。我正在考虑同时使用 Javascript speed,很好的可视化库,并且能够使用浏览器作为界面。

我面临的第一个问题是科学编程的一个显而易见的问题,如何对数据文件进行 I/O?第二个是客户端还是服务器端?最后一个问题,我可以制作真正便携的东西,即将它全部放在 USB 上并从中运行吗?

我花了几周的时间寻找答案。 Server2go 似乎满足了客户端/服务器的需求,我认为意味着我可以在客户端的程序中获取数据。 Server2go 还允许从 USB 运行。我使用的数据文件通常是 XML,并且似乎有几个 javascript 转换器到 JSON。

但是,在环顾四周之后,我不确定我的方法是否有意义。所以在我进一步承诺之前,关于 Javascript 作为科学数据处理的便携式工具有什么建议/想法/指导?

【问题讨论】:

  • 我强烈建议不要使用Javascript进行科学处理。它缺乏数学库、内存管理、强类型。
  • 我同意,对于按照科学标准进行数学运算的支持非常糟糕。
  • @larsmans 我仅从 javascript 对 C++ 的表现如何的 POV 中查看了基准。虽然 Python 没有建议的那么慢,但它仍然慢得多。
  • 确定 JavaScript 具有相当的速度吗?尤其是在数学和矩阵运算方面,很难击败任何可以使用 R 和 numpy 等 Fortran 库的东西。
  • @MikeB:我已经就 Python 基准与 Julia 开发人员取得了联系。 JavaScript 与 C++ 的比较是否公平取决于您要运行的算法;如果他们花很多时间在矩阵乘法上,那你就完蛋了。

标签: javascript data-mining scientific-computing


【解决方案1】:

我必须同意 cmets 的观点,即 JavaScript 不适合科学处理。但是,您最了解自己的要求;也许您已经找到了可以满足您需要的有用库。请注意,您必须自己实现 all 逻辑。没有内置处理复数、矩阵或积分或......通常程序员时间比机器时间更有价值。就个人而言,我会研究编译语言; 之后我创建了第一个版本,但在我最喜欢的任何语言中都不够快。

假设 JavaScript 是要走的路:

数据输入/输出

我能想到三个选项:

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

似乎是您使用 Server2go 找到的解决方案。它需要您编写一个服务器后端,但这可以保持非常简单。作为对客户端应用程序的响应,它真正需要做的就是读取和写入文件。

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

例如Node.js。然后您可以避免对服务器的需求,而只需使用命令行界面,所有代码都将是 JavaScript。除此之外它大致相当于第一个选项。

使用您要求用户保存或加载的file API 创建文件对象

在我看来这是最糟糕的选择,因为需要用户交互。它将避免对服务器的需要;您的应用程序可以是一个简单的 html 文件,它使用 ajax 请求加载所有数据文件。您必须使用特殊开关启动 Chrome 以允许使用 file:// 协议的 ajax 请求,如 here 所述

这些选项与文件 I/O 相关,您不能在 JavaScript 中进行文件 I/O。这是因为浏览器不能允许任意网络代码执行任意文件 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 我实际上没有使用过 Node.js。我假设它会提供某种命令行界面,这意味着客户端界面不需要。除非你真的想看到你的输出......
  • 是的,据我所知(我自己从未使用过),但 OP 谈到了可视化库,我很确定这些库是供客户端使用的......
  • @Bergi:Node 确实提供了内置的 REPL 模块,您可以使用 optimist 作为 getopt 样式的命令行参数。就可视化而言,您不必必须使用浏览器。 node-canvas 让您可以在 Node 中使用画布绘制方法并直接输出到 png。有很多可视化/图表库可以插入到画布中。
  • @Odalrick 感谢您的回复。我认为文件 I/O 是让我最困惑的项目。我已经让 server2go 工作了,但这与了解实际发生的事情不同。 Node.js 对我来说仍然有点神秘,我认为它不能通过 USB 密钥运行。
【解决方案2】:

JavaScript 速度被严重高估。这是 Web 2.0 的神话。

让我稍微解释一下这个说法(不要因为我说了一些你不想听到的话而对我投反对票!)

当然,JavaScript V8 是一个高度优化的虚拟机。它确实在幼稚的基准测试中击败了许多其他脚本语言。

但是,它是一种范围非常有限的语言。它适用于网络的“ADHS 世界”。这是尽最大的努力,但它可能会失败,而且您几乎无法保证事情会按时完成或完成。

以 MongoDB 为例。起初,它似乎又好又快,而且提供了很多。直到您看到例如 MapReduce 仅是单线程的,因此非常慢。发光的并不是所有的金子!

现在看看数据挖掘相关的库,例如 BLAS。基本的线性代数、数学运算等。英特尔和 AMD 等所有 CPU 制造商都为其 CPU 提供优化版本。这是一项优化,需要详细了解各个 CPU,远远超出了我们当前编译器的能力。这些库包含针对各种 CPU 的优化代码路径,它们基本上都在做同样的事情。 对于这些操作,使用 BLAS 等优化库可以轻松实现 5-20 倍的加速;同时,通常在 O(n^2) 或 O(n^3) 中的矩阵运算将主导您的整体运行时间。

所以一门好的数据挖掘语言会让你一路走到机器码!

Pythons 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 Stills 似乎占据了主导地位。
  • 不要以文字为基准。如果您仔细观察,在某些情况下,Java 代码本质上是通过 JNI 调用 C 库(难怪它不会胜过 C)。事实上,许多 C 程序会依次调用 Fortran 子例程。
【解决方案3】:

虽然这个讨论有点老了,而且无论如何我都不是 Javascript 大师,但我发现上述论点对于没有处理速度或高级数学运算的能力是值得怀疑的。 WebGL 是一个用于渲染高级 2D 和 3D 图形的 Javascipt API,它严重依赖高级数学运算。我相信从技术角度来看这些功能是存在的,但是缺少的是处理数据挖掘中包含的统计分析、自然语言处理和其他预测分析的优秀库。

WebGL 基于 openGL,而后者又使用 BLAS 之类的库(库信息 here)。

node.js、w8 等先进技术使其在技术上成为可能。缺少的是我们可以在 R 和 Scilab 中找到的库来执行相同的操作。

【讨论】:

  • 您可能会发现math.js 在这方面是一个有趣的举措。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多