C# 需要数据库建议->;柱状,嵌入式(如有可能)
编辑:由于到目前为止的答案,我想把更多的注意力放在我想关注的方面:一个允许在内存中写入(可以是简单的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中处理数据 我的要求:C# 需要数据库建议->;柱状,嵌入式(如有可能),c#,sql,database,api,concurrency,C#,Sql,Database,Api,Concurrency,编辑:由于到目前为止的答案,我想把更多的注意力放在我想关注的方面:一个允许在内存中写入(可以是简单的C代码)并具有持久性存储选项的数据库,以便从R.Redis内部访问数据。到目前为止,Redis看起来是最有希望的。我还考虑实际使用类似于无锁++或ZrOMQ的东西,以避免同时向数据库写入数据,而是通过消息总线/其他实现将所有的数据保持为持久的数据,并使一个“参与者”处理对内存中的DB或其他解决方案的所有写入操作。除了Redis还有其他想法吗(有人提到SQLite,我还需要测试它的性能)。还有其他建
- 快速写入,快速写入,快速写入:我可能每秒生成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在这方面不合格;-)
- Infobright和Db4o。到目前为止,我喜欢读到的内容,但我承认我还没有查看任何性能统计数据
- 我自己做的事。我可以轻松地以二进制格式存储值类型,并按datetime.ticks对数据进行索引,我只需要以某种方式编写脚本来加载/反序列化Python/R中的数据。但如果我想添加并发性、查询引擎和其他功能,这将是一项艰巨的任务。因此,我寻找一些已经存在的东西李>
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
}