C# 需要数据库建议->;柱状,嵌入式(如有可能)

C# 需要数据库建议->;柱状,嵌入式(如有可能),c#,sql,database,api,concurrency,C#,Sql,Database,Api,Concurrency,编辑:由于到目前为止的答案,我想把更多的注意力放在我想关注的方面:一个允许在内存中写入(可以是简单的C代码)并具有持久性存储选项的数据库,以便从R.Redis内部访问数据。到目前为止,Redis看起来是最有希望的。我还考虑实际使用类似于无锁++或ZrOMQ的东西,以避免同时向数据库写入数据,而是通过消息总线/其他实现将所有的数据保持为持久的数据,并使一个“参与者”处理对内存中的DB或其他解决方案的所有写入操作。除了Redis还有其他想法吗(有人提到SQLite,我还需要测试它的性能)。还有其他建

编辑:由于到目前为止的答案,我想把更多的注意力放在我想关注的方面:一个允许在内存中写入(可以是简单的C代码)并具有持久性存储选项的数据库,以便从R.Redis内部访问数据。到目前为止,Redis看起来是最有希望的。我还考虑实际使用类似于无锁++或ZrOMQ的东西,以避免同时向数据库写入数据,而是通过消息总线/其他实现将所有的数据保持为持久的数据,并使一个“参与者”处理对内存中的DB或其他解决方案的所有写入操作。除了Redis还有其他想法吗(有人提到SQLite,我还需要测试它的性能)。还有其他建议吗

我正在寻找理想的数据库结构/解决方案,以满足我下面的大部分要求,但到目前为止,我完全失败了。你能帮忙吗

我的任务:我在.Net 4.5(C#)中运行一个进程,并生成(通常)值类型,以便在其他应用程序中用于进一步分析,因此喜欢保存在内存中或保存在磁盘上。下面是更多。数据是在不同的任务/线程中生成的,因此基于行的数据格式不适合这种情况(因为在不同的线程中生成的数据是在不同的时间生成的,因此没有对齐)。因此,我认为柱状数据结构可能是合适的,但如果我错了,请纠正我

例如:

任务/线程#1在给定的时间戳生成以下数据

datetime.ticks/输出数据的值

100000001233.23

10000000223.34

1000000006 234.23

Taks/Thread#2在给定的时间戳生成以下数据

datetime.ticks/输出数据的值

1000000002 33.32

100000000534.34

1000000015 54.32

我不需要在.Net运行时对齐时间戳,我首先要保存数据,然后在R或Python中处理数据

我的要求:

  • 快速写入,快速写入,快速写入:我可能每秒生成100000-1000000个数据点,并且需要保存(最坏的情况)或将数据保留在内存中。在它自己的线程上运行写操作是可以的,这样这个过程就可以延迟数据生成过程,但限制是16gb RAM(64位代码),更详细

  • 首选columnar db格式,因为它很适合我以后查询数据的方式,但如果对上述示例有意义,我愿意使用任何其他结构(如果满足所有其他要求,尤其是在写入速度方面,文档/键值也可以)

  • 可以从.Net中引用的API。示例:HDF5可能被一些人认为是有能力的,但我发现他们的.Net端口很糟糕。支持.Net稍好一点的东西会更好,但如果满足所有其他要求,那么我可以处理类似于HDF5.Net端口的东西

  • 如前所述,我喜欢从不同的任务/线程并发写入数据

  • 我受到16gb内存(64位运行.Net进程)的限制,因此我可能会寻找一些不完全在内存中的东西,因为有时我可能会生成更多的数据。内存中有时会持续存在的东西或纯粹的持久性模型可能更可取

  • 首选嵌入式,但如果客户机/服务器解决方案中的服务器可以作为windows服务运行,则没有问题

  • 在数据访问方面,我强烈倾向于使用db解决方案,因为R和Python的接口已经存在,因为我喜欢使用Python中的Panda库进行时间序列对齐和其他分析,并在R中运行分析

  • 如果API/library还支持SQL/SQL-like/Linq/like查询,那就太棒了,但通常我只需要绝对简单的内容,比如在开始日期和结束日期之间加载列数据(给定“键”/“索引”是这种格式),因为我在R/Python中分析和运行查询

  • 如果它带有管理控制台或数据可视化工具,这将是一个加号,但不是必须的

  • 应该是开源的或定价在“可达范围”之内(不,KDB在这方面不合格;-)

好的,这是我到目前为止得到的,也是我得到的,因为大多数db解决方案在写性能要求上已经失败了:

  • Infobright和Db4o。到目前为止,我喜欢读到的内容,但我承认我还没有查看任何性能统计数据
  • 我自己做的事。我可以轻松地以二进制格式存储值类型,并按datetime.ticks对数据进行索引,我只需要以某种方式编写脚本来加载/反序列化Python/R中的数据。但如果我想添加并发性、查询引擎和其他功能,这将是一项艰巨的任务。因此,我寻找一些已经存在的东西
我不能评论——低代表性(我是新来的)——所以你会得到一个完整的答案

首先,你确定你需要一个数据库吗?如果快速写入速度和对R的可移植性是您最大的担忧,那么您是否考虑过平面文件机制?根据你的评论,你愿意批量写出来,但你需要坚持;如果这些是我的需求,我会编写一个直接到disck的高速缓冲系统,然后构建一个单独的任务,周期性地获取磁盘文件并将它们移动到R的数据存储中,这只是在R读取平面文件还不够的情况下

如果可以在事件发生后进行对齐,那么可以将线程写入主并行循环中的独立文件中,每隔一段时间切断每个文件,并将对齐和数据库加载留给子流程

因此(在蹩脚的伪_代码中),构建一个线程进程,您可以使用BackgroundWork调用它
file_name = threadname + '0001.csv' // or something
open(file_name for writing)
while(generating_data) {
    generate_data()
    while (buffer_not_full and very_busy) {
        write_data_to_buffer
        generate_data()
    }
    flush_buffer_to_disk(file_name)
    if(file is big enough or enough time has passed or we're not too busy) {
        close(file_name)
        move(file_name to bob's folder)
        increment file_name
        open(file_name for writing)
    }
)
while(file_name in list of files in bob's folder sorted by date for good measure)
{
    read bob's file
    load bob's file to database
    align dates, make pretty
}
// Producing thread
for (int i=0; i<1000000; i++)
    blockingCollection.Add(myObject);

// Consuming threads
while (true)
{
      var myObject = blockingCollection.Take();
      db4oSession.Store(myObject); // or write it to the files or whathever
}