Javascript и научная обработка?

Matlab, R и Python являются мощными, но дорогостоящими или медленными для некоторых работ по интеллектуальному анализу, которые я хотел бы сделать. Я рассматриваю использование Javascript как для скорость, хорошие библиотеки визуализации и возможность использования браузера в качестве интерфейса.

Первый вопрос, с которым я столкнулся, - это очевидный для научного программирования, как делать I/O для файлов данных? Вторая сторона - клиентская или серверная? Последний вопрос, могу ли я сделать что-то действительно портативное, то есть положить все это на USB и запустить из этого?

Я потратил пару недель на поиски ответов. Server2go, похоже, обращается к потребностям клиента/сервера, который, я думаю, означает, что я могу получать данные в и из программ на стороне клиента. Server2go также позволяет работать с USB. Файлы данных, с которыми я работаю, обычно являются XML и, похоже, несколько Javascript-конвертеров в JSON.

Однако, после осмотра, я не уверен, что мой подход имеет смысл. Итак, прежде чем я буду продолжать, какие-либо советы/мысли/рекомендации по Javascript в качестве переносного инструмента для обработки научных данных?

Ответ 1

Я должен согласиться с комментариями, что JavaScript не подходит для научной обработки. Однако вы лучше всего знаете свои требования; возможно, вы уже нашли полезные библиотеки, которые делают то, что вам нужно. Просто имейте в виду, что вам придется реализовать всю логику самостоятельно. Нет встроенной обработки сложных чисел, матриц или интегралов или... Обычно время программиста гораздо более ценно, чем машинное время. Лично я бы посмотрел на скомпилированные языки; после того, как я создал первую версию, которая недостаточно быстро на любом языке, который мне больше всего нравится.

Предполагая, что JavaScript - это способ:

Data I/O

Я могу представить три варианта:

Отправка и получение данных с помощью ajax на сервер

Кажется, это решение, которое вы нашли с Server2go. Это требует, чтобы вы писали серверный конец, но это может быть довольно простым. Все, что действительно нужно сделать, это возможность читать и писать файлы в ответ на ваше клиентское приложение.

Использование не-браузерной реализации v8, которая включает в себя файл ввода/вывода

Например Node.js. Тогда вы могли бы избежать необходимости в сервере и просто использовать интерфейс командной строки, и весь код будет JavaScript. Кроме того, это примерно эквивалентно первому варианту.

Создание файлового объекта с помощью файла API, который вы попросите пользователя сохранить или загрузить

Это худший вариант, на мой взгляд, поскольку требуется взаимодействие с пользователем. Это позволит избежать необходимости в сервере; ваше приложение может быть простым html файлом, который загружает все файлы данных с помощью ajax-запросов. Вам нужно будет запустить Chrome с помощью специального переключателя, чтобы разрешать ajax-запросы с помощью протокола file://, как описано здесь

Эти параметры предназначены только для ввода/вывода файлов, и вы не можете выполнять ввод/вывод файлов в JavaScript. Это связано с тем, что браузеры не могут позволить произвольному веб-коду выполнять произвольный ввод-вывод файлов; последствия для безопасности будут ужасающими. Каждый параметр описывает один способ не делать ввода/вывода файлов.

Первый взаимодействует с сервером, который выполняет ввод/вывод файлов для клиента.

Второй использует "специальные" версии JavaScript с условиями, отличными от условий браузера, поэтому последствия безопасности не важны. Но это означает, что вам придется искать, как файл ввода-вывода выполняется в реальной реализации, которую вы используете, это не характерно для JavaScript.

Третий требует от пользователя управления файлами ввода/вывода.

Интерфейс

Даже если вы не используете JavaScript для фактической обработки, которая до сих пор является консенсусом, нет ничего, что помешает вам использовать браузер в качестве интерфейса или библиотек JavaScript для визуализации. Это то, над чем хорошо работает JavaScript.

Если вы хотите интерактивно управлять инструментом интеллектуального анализа данных, вам понадобится сервер, который может управлять инструментом. Server2go должен работать или встроенный сервер в Node.js, если вы используете это или... Если вам не требуется интерактивное управление инструментом данных; то есть вы сначала генерируете обработанные данные, а затем смотрите на данные, которых можно избежать, используя протокол file//: и JSONP. Но действительно; избегать сервера не должно быть целью.

Я не буду вдаваться в подробности о проблемах интерфейса, так как нет ничего конкретного, чтобы сказать, и почти все, что было написано о javascript, касается интерфейса.

Одна вещь, используйте библиотеку связывания декларативных данных, например Angular.js или Knockout.js.

Ответ 2

Скорость JavaScript сильно переоценивается. Это миф Web 2.0.

Позвольте мне немного объяснить это утверждение (и не просто понижайте меня, чтобы сказать то, что вы не хотите слышать!)

Конечно, JavaScript V8 - довольно оптимизированная виртуальная машина. В наивных тестах он избивает многие другие языки сценариев.

Однако это очень ограниченный язык. Он предназначен для "мира ADHS" в Интернете. Это лучшее усилие, но оно может просто потерпеть неудачу, и у вас мало гарантий того, что будет завершено или завершено вовремя.

Рассмотрим, например, MongoDB. Сначала это кажется хорошим и быстрым и предлагает много. Пока вы не увидите, например, что MapReduce является однопоточным и, следовательно, очень медленным. Это не все золото, которое светит!

Теперь посмотрите на соответствующие интеллектуальные библиотеки данных, такие как BLAS. Основная линейная алгебра, математические операции и т.д. Все производители процессоров, такие как Intel и AMD, предлагают оптимизированные версии для своих процессоров. Это оптимизация, которая требует детального понимания отдельных процессоров, что выходит за рамки возможностей наших современных компиляторов. Библиотеки содержат оптимизированные кодеки для различных процессоров, которые по существу делают то же самое. И для этих операций использование оптимизированной библиотеки, такой как 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, намного лучше здесь.

Ответ 3

Хотя это обсуждение немного устарело, и я не являюсь гуру Javascript каким-либо образом воображения, я считаю, что приведенные выше аргументы сомневаются в отсутствии скорости обработки или возможностей для продвинутых математических операций. WebGL - это Javascipt API для рендеринга 2D и 3D-графики, которые в значительной степени зависят от математических операций. Я считаю, что возможности существуют с технической точки зрения, однако недостающих являются хорошие библиотеки для обработки статистического анализа, обработки естественного языка и других интеллектуальных аналитических средств, включенных в интеллектуальный анализ данных.

WebGL основан на openGL, который, в свою очередь, использует библиотеки, такие как BLAS (информация о библиотеке здесь).

Достижения, такие как node.js, w8, делают его технически возможным. Отсутствуют библиотеки, которые мы можем найти в R и Scilab для выполнения тех же операций.