存储和访问大量数据
本文关键字:数据 访问 存储 | 更新日期: 2023-09-27 18:04:33
我有一个关于在c#中存储和访问大量数据的问题。
我编写了一个数据分析器和记录器,它必须记录数天的数据。数据每0.1s存储在一个新的2D数组中,目前只"保存"在RAM中。在进行日志记录时,需要在GUI中访问数据。实现这一目标的最佳方式是什么?简单的二进制序列化速度很慢,并且使实时gui运行不流畅。我也尝试过像db40这样的数据库,但是它们占用了大量的硬盘空间。
任何想法?
对于这种情况,我推荐使用TeaFiles。
基本上,它是存储在磁盘上的float文件中的二进制数据的包装器。
下面是主页上给出的示例,以了解它是如何工作的:
// 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);
}
我在生产中使用它来抽取和绘制数百万个点的范围,它工作得非常好。
您不希望将数据存储在数组中。您可以:
a)使用文件系统并将数据写入文本文件,或者更好;
b)使用数据库。如果你不需要标准的数据库解决方案,而更喜欢更小的嵌入式数据库,你可以选择SQLite(这里是c#入门指南)
如果你确实想要一些更健壮的东西,并且可以访问SQL Server,那么你可以使用它。如果你想要一个轻量级和嵌入式的方法,沿着类似的路径SQLite,但想要一些更"建立"的东西,我推荐LocalDB, MSDN Walkthrough。
如果"huge"不是真的很大,那么也许使用postgreSQL作为数据库是你的答案。postgreSQL具有数组数据类型,因此您可以直接将数组保存为单个值。即:考虑这个简单的表,它只有一个Id列(autoinc)和一个val来存储二维整数数组:
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()连续(你会想要包装这与一个事务的性能)。
老实说,其他SQL系列数据库,如SQLite, SQL server没有这个功能,但我可能是错的