Действительно медленное чтение из файла Access 2007 (accdb) из C # - PullRequest
4 голосов
/ 30 сентября 2011

Я пишу приложение на Visual Studio 2008 с C #.Приложение считывает данные из файла доступа, а затем генерирует текстовый файл.Я делал несколько тестов с файлом mdb с 1.000.000 записей и размером почти 1ГБ.Код такой, и весь процесс занимал от 8 до 10 минут.

var connStr =  string.Format("Provider =Microsoft.Jet.OLEDB.4.0; Data Source={0};Persist Security Info=False", this.dbPath);

using (var conn = new OleDbConnection(connStr))
{
            using (var command = conn.CreateCommand())
            {   

                command.CommandText = "SELECT * from Registros r, FOIDS f where r.TICKET = f.TICKET";
                command.CommandType = System.Data.CommandType.Text;
                conn.Open();

                int i = 0;
                string ticket = string.Empty;

                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                         i++;

                            if (!reader.IsDBNull(reader.GetOrdinal("r.TICKET")))
                            {
                                ticket=reader.GetString(reader.GetOrdinal("r.TICKET"));
                                // Some process
                            }
                        }
                    }
                }
          }
    }

Сегодня я получил файл accdb (Access 2007), поэтому изменил строку подключения на эту:

connStr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=False", this.dbPath);

Но после этого изменения чтение нового файла занимает около 4-5 секунд на запись !!!Итак, мой общий процесс занял бы много ДНЕЙ!Я попытался преобразовать файл accdb в старый файл mdb и после этого чтения снова с предыдущей строкой подключения, но проблема остается.Я думаю, что это проблема с самой базой данных, но я не знаю, что делать, в интернете я не нашел никакой информации с такой проблемой.

Есть идеи?Предложения?

Ответы [ 3 ]

4 голосов
/ 30 сентября 2011

По моему опыту, 5 лет назад.

Одна из баз данных доступа превысила 20000 записей и имела размер около 150 МБ.Это начало замедляться, и производительность упала.Итак, мы перешли на SQL.

Вы можете рассмотреть возможность использования SQL Compact Edition или SQL Lite

спасибо

2 голосов
/ 30 сентября 2011

В дополнение к переключению на одну из предложенных баз данных, вы должны изменить тип объекта ticket с string на StringBuilder.

Помните, что ...

Объект String является неизменным.Каждый раз, когда вы используете один из методов в классе System.String, вы создаете новый строковый объект в памяти, который требует нового выделения пространства для этого нового объекта.В ситуациях, когда необходимо выполнить повторные изменения строки, накладные расходы, связанные с созданием нового объекта String, могут быть дорогостоящими.Класс System.Text.StringBuilder можно использовать, когда вы хотите изменить строку без создания нового объекта.Например, использование класса StringBuilder может повысить производительность при объединении множества строк в цикле.

Имея это в виду, учитывайте накладные расходы, которые вы создаете в цикле while каждый раз, когда устанавливаете ticket переменная.- Вы упомянули, что у вас есть 1 миллион записей, что означает, что ваш код создает 1 миллион строковых объектов.

Используя тип StringBuilder вместо типа string, ваш код может выглядеть следующим образом...

....
StringBuilder ticket = new StringBuilder();

using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
         i++;

            if (!reader.IsDBNull(reader.GetOrdinal("r.TICKET")))
            {
                ticket.Append(reader.GetString(reader.GetOrdinal("r.TICKET")));
                // Some process
            }
        }
    }

    // Write the ticket content to a file
    using(StreamWriter sw = new StreamWriter("ticket.txt"))
    {
        sw.WriteLine(ticket.ToString());
    }
}
1 голос
/ 08 марта 2012

Мой опыт преобразования структуры данных из формата файла MDB в ACCDB:

  1. После создания нового файла accdb с точно такими же объектами и данными и после его сжатия, значение accdb увеличивается почти на 40% размер файла больше, чем у старого файла MDB.

  2. Это медленнее.Обработка данных с использованием кода Query и / или VB занимает, по крайней мере, в 3 раза больше времени для достижения конца.

  3. Он достигает 2 ГБ (ограничение размера базы данных) быстрее, чем предыдущий формат достигает 1 ГБ.

И я понимаю, что когда вы сжимаете файл accdb, он сначала генерирует файл mdb, а после переименовывает его для расширения accdb.Это действительно ужасно!

...