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