Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/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处理文件的最佳实践#_C#_.net_Database_File - Fatal编程技术网

C# 通过c处理文件的最佳实践#

C# 通过c处理文件的最佳实践#,c#,.net,database,file,C#,.net,Database,File,我使用的应用程序在15分钟内生成数百个文件(csv)。应用程序的后端接收并处理这些文件(使用这些值更新数据库)。一个问题是数据库锁 使用数千个文件以避免锁定和高效处理这些文件的最佳做法是什么 创建一个文件并处理它会更有效吗?还是一次处理一个文件 有哪些常见的最佳实践 编辑:数据库不是关系型dbms。它是在内存中工作的nosql,面向对象的dbms。锁将保护文件不被处理,直到第一个文件完成为止 class ThreadSafe { static readonly object _locker

我使用的应用程序在15分钟内生成数百个文件(csv)。应用程序的后端接收并处理这些文件(使用这些值更新数据库)。一个问题是数据库锁

使用数千个文件以避免锁定和高效处理这些文件的最佳做法是什么

创建一个文件并处理它会更有效吗?还是一次处理一个文件

有哪些常见的最佳实践


编辑:数据库不是关系型dbms。它是在内存中工作的nosql,面向对象的dbms。

锁将保护文件不被处理,直到第一个文件完成为止

class ThreadSafe
{
  static readonly object _locker = new object();
  static int _val1, _val2;

  static void Go()
  {
    lock (_locker)
    {
      if (_val2 != 0) Console.WriteLine (_val1 / _val2);
      _val2 = 0;
    }
  }
}

在对你的具体情况了解有限的情况下


就性能而言,关闭文件可能是您在时间上执行的最昂贵的操作,因此我的建议是,如果您可以选择单文件路径,那么这将是最有效的方法。

,假设您有N台机器在创建文件,并且每个文件在某种意义上是相似的,它通常会被消耗到数据库中的相同表中


我会设置一个队列,让所有的机器将它们的文件写入队列,然后让另一端的某个东西从队列中取出东西,然后将其处理到数据库中。所以,一次一个文件。您甚至可以通过直接写入队列来优化文件操作。

如果遇到锁问题,则可能是正在更新的数据库表上没有正确的索引。获取执行更新的SQL代码,并找出它的执行计划;如果您使用的是MSSQL,则可以在SSMS中执行此操作;如果更新导致表扫描,则需要添加一个索引,以帮助隔离正在更新的记录(除非您正在更新表中的每一条记录;这可能是一个问题)

听起来你要么想要一个单一的文件机制,要么让所有的文件从一个共享的单一目录中消耗掉,这个目录会不断地检查最旧的csv文件,并在代码中运行它。无论如何,这可能是“最便宜”的解决方案。如果您实际生成了更多可以处理的文件,那么我可能会重新考虑整个系统架构,而不是“邦迪”方法。

您可以尝试在应用程序代码级别处理并发问题,并强制dbms在更新期间不锁定对象

(在RDBMS中,您将设置可能的最低事务隔离级别(读取未提交))


如果可以这样做,另一个选项是截断所有旧对象并批量插入新值。

是否有此应用程序的单个实例正在运行?您是否跨多个线程执行数据库操作?有几个服务器运行同一个应用程序,它们正在生成文件。“数据库锁”到底有什么问题?更新会锁定数据库。正在创建什么类型的文件?在此方案中,您会做什么?我已经有了这样的方案,但是我担心会有一些争论。@user177883:什么类型的争论?此方案应缓解任何数据库锁定。是否存在性能问题或类似问题?如果文件数量超出了处理它们的能力,该怎么办?假设你每天有10亿次页面浏览量。对于每个页面视图,您都需要处理一些数据。我想你们的答案应该是添加更多的服务器,从队列中挑选更多的服务器。然后,另一种选择是重构数据库或生成的文件,以避免锁定,这样你们就可以进行更多的并发处理。例如,如果要在一个表上执行N个操作,如果x个操作是插入,y个操作是更新,则可能会并行处理插入,然后串行处理更新。但是,如果你说的是数以十亿计的页面浏览量,那么我们真的需要更多关于你的文件和数据库的信息,以减轻锁定并确保性能。我的数据库中没有表,面向对象,完全在内存中工作。如果我使用的是nosql,面向对象数据库,它只在内存中工作会怎么样。