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

时间:2010-05-03 15:24:43

标签: c# .net database file

我工作的应用程序在15分钟的时间内生成数百个文件(csv)。并且应用程序的后端获取这些文件并对其进行处理(使用这些值更新数据库)。一个问题是数据库锁。

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

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

有哪些常见的最佳做法?

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

6 个答案:

答案 0 :(得分:3)

所以,假设您有N-Machines创建文件,并且每个文件在某种意义上是相似的,因为它通常会被消耗到数据库中的相同表中......

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

对您的具体情况知之甚少......

性能方面,关闭文件可能是您在时间方面执行的最昂贵的操作,所以我的建议是如果您可以使用单一文件路径 - 那么这将是最高效的方法。

答案 3 :(得分:0)

Lock将保护文件不被处理,直到第一个完成。

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;
    }
  }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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