¿Cuál sería el mejor enfoque para manejar el almacenamiento de datos intradiarios en tiempo real?
Para mi investigación personal siempre he importado solo desde archivos planos en memoria (EOD histórico), así que no tengo mucha experiencia con esto. Actualmente estoy trabajando en un proyecto secundario, que requeriría comillas diarias de acciones actualizadas cada minuto desde una fuente externa. Por el momento, supongo que cualquier solución de base de datos popular debería poder manejarlo sin sudar demasiado en este escenario. Pero me gustaría que la solución adoptada escale fácilmente cuando se necesiten ticks en tiempo real.
Un problema similar ha sido mencionado por Marko, aunque fue principalmente específico de R. Estoy buscando un almacenamiento de datos universal accesible tanto para interfaces web ligeras (PHP/Ruby/Flex) como para la parte analítica de atrás (C++, R o Python, aún no lo sé).
Según lo que chrisaycock mencionó, las bases de datos orientadas a columnas deberían ser la solución más viable. Y parece ser el caso.
Pero no estoy seguro de entender todas las complejidades del almacenamiento orientado a columnas en algunos escenarios de uso ejemplares:
- Obtener todos o un subconjunto de datos de precios para un ticker específico para trazar en la interfaz gráfica
- En comparación con las soluciones basadas en filas, la obtención de datos de precios debería ser más rápida porque es una lectura secuencial. Pero ¿cómo influye en esto almacenar múltiples tickers en un solo lugar? Por ejemplo, una declaración como "seleccionar todas las marcas de tiempo y datos de precios donde el ticker sea igual a algo". ¿No tengo que comparar el ticker en cada fila que obtengo? Y en la situación en la que tengo que proporcionar datos completos para alguna aplicación de interfaz gráfica, ¿no sería más eficiente servir un archivo plano crudo para el instrumento solicitado?
- Análisis realizado en la parte de atrás
- Cosas como calcular valores únicos para una acción (por ejemplo, varianza, rendimiento de los últimos x días) y series temporales dependientes (rendimientos diarios, indicadores técnicos, etc.). La obtención de datos de entrada para los cálculos debería ser más eficiente que en el caso anterior, pero ¿qué hay de la escritura? La ganancia que veo es escribir en masa el resultado final (como el valor del indicador calculado para cada marca de tiempo), pero aún así no sé cómo maneja la base de datos mi mezcla de diferentes tickers en una tabla. ¿La partición horizontal/sharding lo maneja automáticamente por mí o es mejor dividir manualmente en una estructura de tabla por instrumento (lo cual parece innecesariamente engorroso)?
- Actualizar la base de datos con nuevos ticks entrantes
- ¿No sería más eficiente aquí usar orientación basada en filas, verdad? Y lo mismo ocurre con la actualización de datos agregados (por ejemplo, tablas diarias OHLC). ¿No sería un posible cuello de botella?
Todo esto está en el contexto de las soluciones a código abierto disponibles. Inicialmente pensé en InfiniDB o HBase, pero también he visto mencionados aquí MonetDB y InfoBright. Realmente no necesito una "calidad de producción" (al menos por ahora) como mencionó chrisaycock en la pregunta referida, ¿así que sería alguna de estas una mejor elección que las demás?
Y el último problema: ¿a partir de qué punto de carga son necesarias las bases de datos de series temporales especializadas? Desafortunadamente, cosas como kdb+ o FAME están fuera de alcance en este caso, así que estoy contemplando cuánto se puede hacer en hardware estándar con bases de datos relacionales (como MySQL/PostgreSQL) o almacenes de clave-valor (como Tokyo/Kyoto Cabinet's B+ tree) - ¿es realmente un callejón sin salida? ¿Debería quedarme simplemente con algunas de las soluciones mencionadas orientadas a columnas debido a que mi aplicación no es crítica o incluso eso es una precaución innecesaria?
Gracias de antemano por tu aporte a esto. Si alguna parte es demasiado confusa, házmelo saber en un comentario. Intentaré enmendarlo en consecuencia.
EDICIÓN:
Parece que estrictamente hablando HBase no es una tienda orientada a columnas sino más bien un mapa ordenado multidimensional esparcido, distribuido, persistente, por lo que lo he tachado de la pregunta original.
Después de algunas investigaciones, estoy más inclinado hacia InfiniDB. Tiene todas las características que necesito, admite SQL (se pueden usar conectores/envoltorios estándar de MySQL para el acceso) y el subconjunto completo de DML. Lo único que falta en la edición de código abierto es la compresión sobre la marcha y la escalabilidad a clústeres. Pero supongo que sigue siendo un buen negocio por el precio, considerando que es gratis.
2 votos
Por cierto, encontré una buena introducción al tema (www8.cs.umu.se/education/examina/Rapporter/JohanJonsson2009.pdf) que puede resultar útil para futuros lectores de esta pregunta.