Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储和访问大量数据_C#_Storage - Fatal编程技术网

C# 存储和访问大量数据

C# 存储和访问大量数据,c#,storage,C#,Storage,关于在C#中存储和访问大量数据,我有一个问题 我编程了一个数据分析仪和记录器,它必须记录数天的数据。数据每隔0.1s存储在一个新的2D数组中,当前仅“保存”在RAM中。 记录日志时,需要能够在GUI中访问数据。 实现这一目标的最佳方式是什么? 简单的二进制序列化速度很慢,会使准时GUI无法顺利运行。 我也尝试过像db4o这样的数据库,但它们使用大量的硬盘空间 有什么想法吗?您不想将数据存储在数组中。 你可以: a) 使用文件系统并将数据写入文本文件,或者更好 b) 使用数据库。如果您不需要标准的

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

我编程了一个数据分析仪和记录器,它必须记录数天的数据。数据每隔0.1s存储在一个新的2D数组中,当前仅“保存”在RAM中。 记录日志时,需要能够在GUI中访问数据。 实现这一目标的最佳方式是什么? 简单的二进制序列化速度很慢,会使准时GUI无法顺利运行。 我也尝试过像db4o这样的数据库,但它们使用大量的硬盘空间


有什么想法吗?

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

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

b) 使用数据库。如果您不需要标准的数据库解决方案,并且希望使用更小的嵌入式解决方案,那么可以使用SQLite()


如果您确实想要更健壮一点的东西,并且能够访问SQL Server,那么您可以使用它。如果您希望采用与SQLite类似的轻量级嵌入式方法,但希望采用更“成熟”的方法,我建议您不要将数据存储在数组中。 你可以:

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

b) 使用数据库。如果您不需要标准的数据库解决方案,并且希望使用更小的嵌入式解决方案,那么可以使用SQLite()

如果您确实想要更健壮一点的东西,并且能够访问SQL Server,那么您可以使用它。如果您希望采用与SQLite类似的轻量级嵌入式方法,但希望采用更“成熟”的方法,我建议。

如果“庞大”并不是真正的庞大,那么使用postgreSQL作为数据库可能是您的答案。postgreSQL具有数组数据类型,因此可以直接将数组保存为单个值。即: 考虑这个简单表只有ID列(AutoCin)和一个存储二维数组的变量:
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都没有这种功能,但我可能错了。

如果“巨大”不是真正的巨大,那么使用postgreSQL作为数据库可能是你的答案。postgreSQL具有数组数据类型,因此可以直接将数组保存为单个值。即: 考虑这个简单表只有ID列(AutoCin)和一个存储二维数组的变量:
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,都没有这种功能,但我可能错了。

我不推荐在这种情况下使用足够的数据库

基本上,它是存储在磁盘上浮点文件中的二进制数据的包装器

以下是主页上给出的示例,以了解其工作原理:

// 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);
}
//定义时间序列项目类型
结构勾号
{
公共时间;
公开双价;
公共int卷;
}
//创建文件并写入值
使用(var tf=TeaFile.Create(“acme.tea”))
{
写入(新勾号{Price=5,Time=DateTime.Now,Volume=700});
Write(新勾号{Price=15,Time=DateTime.Now.AddHours(1),Volume=1700});
// ...
}
//将文件中所有项目的价格相加
使用(var tf=TeaFile.OpenRead(“acme.tea”))
{
返回tf.Items.Sum(item=>item.Price);
}

我在生产中使用它来截取和绘制数百万点范围内的图像,效果非常好。

对于这种场景,我不能推荐足够的使用

基本上,它是存储在磁盘上浮点文件中的二进制数据的包装器

以下是主页上给出的示例,以了解其工作原理:

// 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);
}
//定义时间序列项目类型
结构勾号
{
公共时间;
公开双价;
公共int卷;
}
//创建文件并写入值
使用(var tf=TeaFile.Create(“acme.tea”))
{
写入(新勾号{Price=5,Time=DateTime.Now,Volume=700});
Write(新勾号{Price=15,Time=DateTime.Now.AddHours(1),Volume=1700});
// ...
}
//将文件中所有项目的价格相加
使用(var tf=TeaFile.OpenRead(“acme.tea”))
{
返回tf.Items.Sum(item=>item.Price);
}

我在生产中使用它来截取和绘制数百万点范围内的图像,效果非常好。

就个人而言,我喜欢他们称之为“数据库”的东西。就个人而言,我喜欢他们称之为“数据库”的东西。