que - Javascript y el procesamiento científico?
javascript pdf (3)
Matlab, R y Python son potentes pero costosos o lentos para algunos trabajos de minería de datos que me gustaría hacer. Estoy considerando usar Javascript tanto para la speed , buenas bibliotecas de visualización, como para poder usar el navegador como una interfaz.
La primera pregunta que enfrenté es la obvia para la programación científica, ¿cómo hacer E / S a los archivos de datos? ¿El segundo es del lado del cliente o del lado del servidor? La última pregunta, ¿puedo hacer algo que sea verdaderamente portátil, es decir, ponerlo todo en un USB y ejecutar desde eso?
He pasado un par de semanas buscando respuestas. Server2go parece satisfacer las necesidades del cliente / servidor, lo que creo que significa que puedo obtener datos hacia y desde los programas en el lado del cliente. Server2go también permite ejecutar desde un USB. Los archivos de datos con los que trabajo suelen ser XML y parece que hay varios convertidores de JavaScript a JSON.
Sin embargo, después de mirar alrededor, no estoy seguro de si mi enfoque tiene sentido. Entonces, antes de seguir adelante, ¿algún consejo / opinión / orientación sobre Javascript como herramienta portátil para el procesamiento de datos científicos?
Aunque esta discusión es un poco vieja y no soy un gurú de Javascript por ningún tramo de la imaginación, encuentro los argumentos anteriores dudosos acerca de no tener la velocidad de procesamiento o las capacidades para operaciones matemáticas avanzadas. WebGL es una API de Javascipt para representar gráficos 2D y 3D avanzados que se basan en gran medida en operaciones matemáticas avanzadas. Creo que las capacidades están ahí desde un punto de vista técnico, sin embargo, lo que falta son buenas bibliotecas para manejar el análisis estadístico, el procesamiento del lenguaje natural y otros análisis predictivos incluidos en la minería de datos.
WebGL se basa en openGL, que a su vez utiliza bibliotecas como BLAS (información de la biblioteca here ).
Avances como node.js, w8 lo hacen técnicamente posible. Lo que falta son bibliotecas como las que podemos encontrar en R y Scilab para hacer las mismas operaciones.
Estoy de acuerdo con los comentarios de que JavaScript no es una buena opción para el procesamiento científico. Sin embargo, usted conoce mejor sus necesidades; Tal vez ya hayas encontrado bibliotecas útiles que hacen lo que necesitas. Solo ten en cuenta que tendrás que implementar toda la lógica tú mismo. No hay un manejo integrado de números complejos, matrices o integrales o ... Por lo general, el tiempo del programador es mucho más valioso que el tiempo de la máquina. Personalmente, me gustaría mirar en lenguajes compilados; después de crear una primera versión que no es lo suficientemente rápida en el idioma que más me gusta.
Suponiendo que JavaScript es el camino a seguir:
E / S de datos
Puedo pensar en tres opciones:
Envío y recepción de datos con ajax a un servidor.
Parece ser la solución que has encontrado con Server2go. Requiere que escribas un servidor de back-end, pero eso puede ser bastante simple. Todo lo que realmente necesita es poder leer y escribir archivos como respuesta a su aplicación del lado del cliente.
Usando una implementación de v8 sin navegador que incluye E / S de archivos
Por ejemplo Node.js Luego, podría evitar la necesidad de un servidor y simplemente usar una interfaz de línea de comandos, y todo el código será JavaScript. Aparte de eso, es aproximadamente equivalente a la primera opción.
Creando un objeto de archivo utilizando la API de archivo que le pide al usuario que guarde o cargue
En mi opinión, es la peor opción, ya que se requiere la interacción del usuario. Evitaría la necesidad de un servidor; su aplicación podría ser un simple archivo html que carga todos los archivos de datos con solicitudes ajax. Tendría que iniciar Chrome con un interruptor especial para permitir las solicitudes de ajax con el file://
protocolo, como se describe here
Estas opciones solo están relacionadas con la E / S de archivos y no puede realizar E / S de archivos en JavaScript. Esto se debe a que los navegadores no pueden permitir que un código web arbitrario realice I / O de archivos arbitrarios; Las implicaciones de seguridad serían horrendas. Cada opción describe una forma de no hacer I / O de archivos.
El primero se comunica con un servidor que realiza la E / S de archivos para el cliente.
El segundo utiliza versiones "especiales" de JavaScript, con condiciones distintas a las del navegador, por lo que las implicaciones de seguridad no son importantes. Pero eso significa que tendrá que ver cómo se realiza la E / S de archivos en la implementación real que usa, no es común en JavaScript.
El tercero requiere que el usuario controle la E / S del archivo.
Interfaz
Incluso si no utiliza JavaScript para realizar el procesamiento real, que hasta ahora es el consenso, no hay nada que le impida utilizar un navegador como interfaz o bibliotecas de JavaScript para la visualización. Eso es algo en lo que JavaScript es bueno.
Si desea controlar de forma interactiva su herramienta de minería de datos, necesitará un servidor que pueda controlar la herramienta. Server2go debería funcionar, o el servidor incorporado en Node.js si usa eso o ... Si no necesita un control interactivo de la herramienta de datos; es decir, primero genera los datos procesados, luego mire los datos que puede evitar un servidor utilizando el file//:
protocol y JSONP . Pero en serio; Evitar un servidor no debería ser un objetivo.
No voy a entrar en detalles sobre los problemas de la interfaz, ya que no hay nada específico que decir y casi todo lo que se ha escrito sobre javascript es sobre la interfaz.
Una cosa es usar una biblioteca de enlace de datos declarativa como Angular.js o Knockout.js .
La velocidad de JavaScript está muy sobrevalorada . Este es un mito web 2.0.
Déjame explicarte un poco este reclamo (¡y no solo me rechaces por decir algo que no quieres escuchar!)
Claro, JavaScript V8 es una máquina virtual bastante altamente optimizada. Supera a muchos otros lenguajes de scripting en puntos de referencia ingenuos.
Sin embargo, es un lenguaje de alcance muy limitado. Está destinado al "mundo ADHS" de la web. Es un mejor esfuerzo, pero puede fallar y usted tiene pocas garantías de que las cosas se completen o se completen a tiempo.
Considere por ejemplo MongoDB. Al principio parece ser bueno y rápido y ofrecer mucho. Hasta que vea, por ejemplo, que MapReduce es solo de un solo hilo y, por lo tanto, muy lento. ¡No todo es oro que brilla!
Ahora mire bibliotecas relevantes de minería de datos como BLAS. Álgebra lineal básica, operaciones matemáticas y similares. Todos los fabricantes de CPU como Intel y AMD ofrecen versiones optimizadas para sus CPU. Esta es una optimización que requiere una comprensión detallada de las CPU individuales, mucho más allá de las capacidades de nuestros compiladores actuales. Las bibliotecas contienen rutas de código optimizadas para varias CPU, todas esencialmente haciendo lo mismo. Y para estas operaciones, el uso de una biblioteca optimizada como BLAS puede producir fácilmente una aceleración de 5-20x; al mismo tiempo, las operaciones de matriz que a menudo están en O (n ^ 2) u O (n ^ 3) dominarán su tiempo de ejecución general.
¡Así que un buen lenguaje para la minería de datos le permitirá ir hasta el código de máquina!
Pythons SciPy y R son buenas elecciones aquí. Tienen las bibliotecas optimizadas en su interior y son de fácil acceso, pero al mismo tiempo permiten hacer las cosas en un lenguaje más simple.
Echa un vistazo a este lenguaje de programación de referencia:
http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html
El JavaScript puro tiene una gran variación, lo que indica que puede hacer algunas cosas rápido (en su mayoría expresiones regulares) otras mucho más lento. Claramente puede vencer a PHP, pero será igual de claramente vencido por C y Java.
El multihilo también es importante para la minería de datos moderna. Hoy en día, pocos sistemas grandes tienen un solo núcleo, y usted desea utilizar todos los núcleos. Por lo tanto, necesita bibliotecas y un lenguaje de programación que tenga un poderoso conjunto de operaciones de multihilo. Esta es la razón por la que Fortran y C están perdiendo popularidad aquí. Otros lenguajes como Java son mucho mejores aquí.