存储和访问大量数据

本文关键字:数据 访问 存储 | 更新日期: 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没有这个功能,但我可能是错的