我有一个关于在C#中存储和访问大量数据的问题。
我编写了一个数据分析器和记录器,它必须记录几天的数据。数据每0.1s存储在一个新的二维数组中,目前只“保存”在RAM中。在进行日志记录时,需要能够在GUI中访问数据。实现这一目标的最好方法是什么?简单的二进制序列化速度很慢,并且会使准时的GUI运行不流畅。我也尝试过像db4o这样的数据库,但它们使用了大量的硬盘空间。
有什么想法吗?
发布于 2015-07-25 22:53:44
您不希望将数据存储在数组中。您可以:
a)使用文件系统并将数据写入文本文件,或者更好;
b)使用数据库。如果您不需要标准的数据库解决方案,而是更喜欢更小、更内嵌的解决方案,您可以使用SQLite (here's a getting started guide for C#)
如果你确实想要一些更健壮的东西,并且可以访问SQL Server,那么你可以使用它。如果你想采用类似于SQLite的轻量级嵌入式方法,但又想要一些更“成熟”的东西,我建议你使用LocalDB,MSDN Walkthrough。
发布于 2015-07-26 00:42:29
如果“巨型”并不是真正的巨型,那么也许使用postgreSQL作为数据库就是你的答案。postgreSQL具有数组数据类型,因此您可以直接将数组保存为单个值。ie:考虑这个简单的表,它只有一个Id列(autoinc)和一个用来存储整数的2D数组的aVals:
create table arrayLog (
id serial,
aVals integer [][]
)在C#中,您可以这样做:
using (NpgsqlConnection con=new NpgsqlConnection(@"..."))
{
string iCmd = "insert into arrayLog (aVals) values (@aVals)";
var cmd = new NpgsqlCommand(iCmd,con);
int[,] vals = new int[,] {
{40,50,90},
{400,500,900}
};
cmd.Parameters.AddWithValue("@aVals", vals);
con.Open();
cmd.Parameters["@aVals"].Value = vals;
cmd.ExecuteNonQuery();
con.Close();
}您只需做一次准备工作,并将新数组分配给.Value并连续调用ExecuteNonQuery() (为了提高性能,您可能希望将其与事务包装在一起)。
AFAIK,其他SQL系列数据库,如SQLite,SQL server没有这个能力,但我可能是错的。
发布于 2015-08-11 20:05:28
对于这种情况,我不推荐使用TeaFiles。
基本上,它是对存储在磁盘上的浮点文件中的二进制数据的包装。
下面是主页上给出的示例,看看它是如何工作的:
// define time series item type
struct Tick
{
public Time Time;
public double Price;
public int Volume;
}
// create file and write values
using (var tf = TeaFile<Tick>.Create("acme.tea"))
{
tf.Write(new Tick { Price = 5, Time = DateTime.Now, Volume = 700 });
tf.Write(new Tick { Price = 15, Time = DateTime.Now.AddHours(1), Volume = 1700 });
// ...
}
// sum the prices of all items in the file
using (var tf = TeaFile<Tick>.OpenRead("acme.tea"))
{
return tf.Items.Sum(item => item.Price);
}我在生产中使用它来抽取并绘制数百万个点内的范围,它工作得非常好。
https://stackoverflow.com/questions/31627603
复制相似问题