存储和访问大量数据

时间:2015-07-25 14:40:44

标签: c# storage

我有一个关于在C#中存储和访问大量数据的问题。

我编写了一个数据分析器和记录器,它必须在几天内记录数据。数据每0.1秒存储在一个新的2D数组中,目前只保存了#34;在RAM中。 在记录时,数据需要在GUI中可访问。 实现这一目标的最佳方法是什么? 简单的二进制序列化很慢,并且使得on-time-GUI无法顺利运行。 我也尝试过像db4o这样的数据库,但是他们使用了一大堆硬盘空间。

任何想法?

3 个答案:

答案 0 :(得分:0)

您不希望将数据存储在数组中。 你可以:

a)使用文件系统并将数据写入文本文件,或更好;

b)使用数据库。如果你不需要一个标准的数据库解决方案,并且更喜欢一些更小和嵌入的东西,你可以使用SQLite(here's a getting started guide for C#

如果您确实需要更强大的功能并且可以访问SQL Server,那么您可以使用它。如果你想在类似于SQLite的路径上使用轻量级嵌入式方法,但又想要更多“建立”,我建议LocalDBMSDN Walkthrough。< / p>

答案 1 :(得分:0)

如果&#34;巨大&#34;并不是真的很大,那么也许使用postgreSQL作为数据库是你的答案。 postgreSQL具有数组数据类型,因此您可以直接将数组保存为单个值。即: 考虑这个简单的表只有一个Id列(autoinc)和一个aVals来存储一个2D整数数组:

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服务器都没有这个功能,但我可能错了。

答案 2 :(得分:0)

对于这种情况,我不能建议使用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);
}

我在生产中使用它来抽取并绘制数百万个点内的范围,并且效果非常好。