编辑:由于到目前为止的答案,我想更多地关注我喜欢归零的内容:一个允许在内存中写入(可能是简单的 C# 代码)并具有持久性以访问数据的存储选项的数据库到目前为止,从 R. Redis 内部看起来最有希望。我还考虑实际使用类似于 Lockfree++ 或 ZeroMQ 的东西,以避免将数据同时写入数据库,而是通过消息总线/其他实现发送所有要持久化的数据,并让一个“参与者”处理所有写入操作到内存数据库或其他解决方案。除了 Redis 之外还有其他想法(有些人提到了 SQLite,我仍然需要测试它的性能)。还有其他建议吗?
我正在寻找满足以下大部分要求的理想数据库结构/解决方案,但到目前为止我完全失败了。你能帮忙吗?
我的任务:我在 .Net 4.5 (C#) 中运行一个进程并生成(通常)我想在其他应用程序中用于进一步分析的值类型,因此喜欢保留在内存中或保留在磁盘上。更多内容如下。数据是在不同的任务/线程中生成的,因此基于行的数据格式不能很好地匹配这种情况(因为在不同的线程中生成的数据是在不同的时间生成的,因此没有对齐)。因此,我认为列式数据结构可能是合适的,但如果我错了,请纠正我。
例子:
Tasks/Thread #1 在给定的时间戳生成以下数据
datetime.ticks / 输出数据的值
1000000001 233.23
1000000002 233.34
1000000006 234.23 ...
任务/线程#2 在给定的时间戳生成以下数据
datetime.ticks / 输出数据的值
1000000002 33.32
1000000005 34.34
1000000015 54.32 ...
我不需要在 .Net 运行时对齐时间戳,我首先是在保存数据并稍后在 R 或 Python 中处理数据之后。
我的要求:
快速写入、快速写入、快速写入:可能会发生我每秒生成 100,000-1,000,000 个数据点并且需要持久化(最坏情况)或将数据保留在内存中的情况。可以在自己的线程上运行写入,因此该过程可以滞后于数据生成过程,但限制是 16gb RAM(64 位代码),更多信息如下。
首选是柱状 db 格式,因为它很适合我以后如何查询数据,但如果对上面的示例有意义,我对任何其他结构持开放态度(如果所有其他要求,文档/键值也可以满足,尤其是在写入速度方面)。
可以从 .Net 中引用的 API。示例:HDF5 可能被某些人认为是有能力的,但我发现他们的 .Net 端口很糟糕。支持 .Net 的东西会更好一点,但如果满足所有其他要求,那么我可以处理类似于 HDF5 .Net 端口的东西.
尽可能并发写入:如前所述,我喜欢从不同的任务/线程并发写入数据。
我受到 16gb 内存的限制(以 64 位运行 .Net 进程),因此我可能会寻找并非纯粹在内存中的东西,因为有时我可能会生成比这更多的数据。有时会持续存在的内存中的东西或纯粹的持久性模型可能更可取。
首选嵌入式,但如果客户端/服务器解决方案中的服务器可以作为 Windows 服务运行,则没有问题。
在数据访问方面,我非常喜欢已经存在 R 和 Python 接口的数据库解决方案,因为我喜欢在 Python 中使用 Panda 库进行时间序列对齐和其他分析,并在 R 中运行分析。
如果 API/库还支持 SQL/SQL/Linq/ 之类的查询,这将是非常棒的,但通常我只需要绝对的基本框架,例如在开始日期和结束日期之间加载列数据(给定“键”/索引是这种格式),因为我在 R/Python 中分析和运行查询。
如果它带有管理控制台或数据可视化器,那将是一个加分项,但不是必须的。
应该是开源的或在“范围内”定价(不,KDB 在这方面不符合条件;-)
好的,这是我到目前为止所拥有的,这也是我所得到的,因为大多数数据库解决方案在写入性能要求上已经失败了:
- Infobright 和 Db4o。我喜欢我目前阅读的内容,但我承认我没有检查任何性能统计数据
- 自己做了点什么。我可以轻松地以二进制格式存储值类型并通过 datetime.ticks 索引数据,我只需要以某种方式编写脚本来加载/反序列化 Python/R 中的数据。但如果我想添加并发、查询引擎和其他好东西,这将是一项艰巨的任务。因此,我寻找已经存在的东西。