Лучшие практики для работы с файлами через c # - PullRequest
4 голосов
/ 03 мая 2010

Приложение, над которым я работаю, генерирует несколько сотен файлов (csv) за 15 минут. и серверная часть приложения берет эти файлы и обрабатывает их (обновляет базу данных этими значениями). Одной из проблем является блокировка базы данных.

Каковы рекомендации по работе с несколькими тысячами файлов, чтобы избежать блокировки и эффективной обработки этих файлов?

Было бы эффективнее создать один файл и обработать его? или обрабатывать один файл за раз?

Каковы некоторые распространенные лучшие практики?

Редактировать: база данных не является реляционной БД. Это nosql, объектно-ориентированные базы данных, которые работают в памяти.

Ответы [ 6 ]

3 голосов
/ 03 мая 2010

Итак, при условии, что у вас есть N-машины, создающие файлы, и каждый файл похож в том смысле, что он обычно используется в одних и тех же таблицах базы данных ...

Я бы настроил Очередь, чтобы все машины записывали свои файлы в очередь, а затем что-то на другой стороне выбирало вещи из очереди и затем обрабатывало их в базе данных. Итак, один файл за раз. Вы могли бы даже оптимизировать файловые операции, напрямую записав их в очередь.

2 голосов
/ 03 мая 2010

Если у вас возникают проблемы с блокировками, скорее всего, обновляемые таблицы базы данных не имеют надлежащих индексов. Получить код SQL, который выполняет обновление, и выяснить, каков план выполнения для него; если вы используете MSSQL, вы можете сделать это в SSMS; если UPDATE вызывает сканирование таблицы, вам нужно добавить индекс, который поможет изолировать обновляемые записи (если вы не обновляете каждую запись в таблице; это может быть проблемой).

1 голос
/ 03 мая 2010

С ограниченным знанием вашего точного сценария ...

С точки зрения производительности, закрытие файла, возможно, является самой дорогой операцией, которую вы выполняете с точки зрения времени, поэтому я бы посоветовал вам пойти по пути одного файла - тогда это был бы наиболее эффективный подход.

0 голосов
/ 04 мая 2010

Вы можете попытаться решить проблемы параллелизма на уровне кода вашего приложения и заставить dbms не блокировать объекты во время обновлений.

(В СУБД вы бы установили наименьший возможный уровень изоляции транзакции (читай незафиксированным))

При условии, что вы можете сделать это, другой вариант - обрезать все старые объекты и массово вставить новые значения.

0 голосов
/ 03 мая 2010

Звучит так, будто вам нужен либо единый файловый механизм, либо все файлы используются из единого общего каталога, который постоянно проверяет самый старый файл CSV и запускает его через ваш код. В любом случае, это может быть «самым дешевым» решением. Если вы на самом деле генерируете больше файлов, которые вы можете обработать, то я бы, вероятно, переосмыслил общую архитектуру системы вместо подхода «полосная помощь».

0 голосов
/ 03 мая 2010

Блокировка защитит файлы от обработки, пока не будет завершен первый.

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;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...