2009-06-18 3 views
0

Я пытаюсь экспортировать stringdictionary в текстовый файл, у него более одного миллиона записей, для экспорта в текстовый файл требуется более 3 минут, если я использую цикл.StringDictionary To TextFile

Есть ли способ сделать это быстрее?

С уважением

+0

Дополнительная информация требуется .... –

+1

Какой метод экспорта вы используете сейчас? – Steef

+3

Возможно, вы захотите попробовать опубликовать часть своего кода, что намного проще для людей, чтобы увидеть проблемы таким образом. – Mark

ответ

4

Ну, это зависит от того, какого формата вы используете для экспорта, но в целом, самые большие накладные расходы для экспорта больших объемов данных будут I/O. Вы можете уменьшить это, используя более компактный формат данных и, если это возможно, меньше манипулировать данными в памяти (чтобы избежать копирования копий).

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

Если вы максимизируете ввод/вывод на диск (например, запись с хорошим процентом скорости диска, которая будет иметь десятки мегабайт в секунду в современной системе), вы можете рассмотреть возможность сжатия данных перед вами Напиши это. Это использует больше CPU, но вы пишете меньше на диск, когда вы это делаете. Это также, вероятно, увеличит скорость чтения файла, если у вас будет такое же узкое место на стороне чтения.

Если вы максимизируете свой процессор, перед записью вам нужно сделать меньше обработки данных. Например, если вы используете библиотеку сериализации, избегайте этого и переключаясь на более простой, более специализированный формат данных. Рассмотрим простейший формат, который вам нужен: возможно, просто слово для длины строки, за которым следуют строковые данные, повторяющиеся для каждого ключа и значения.

+0

«Если вы используете библиотеку сериализации, например, избегайте этого и переключаясь на более простой, более специализированный формат данных». - или используйте более быструю библиотеку сериализации; -p –

3

Обратите внимание, что большинство конструкций словаря не сохраняют порядок вставки - это часто делает их неудовлетворительными, если вы хотите воспроизводить содержимое файла, но (в зависимости от размера) мы можем улучшить время ... это (ниже) занимает около 3.5с (для экспорта) писать только под 30MB:

StringDictionary data = new StringDictionary(); 
    Random rand = new Random(123456); 
    for (int i = 0; i < 1000000; i++) 
    { 
     data.Add("Key " + i, "Value = " + rand.Next()); 
    } 
    Stopwatch watch = Stopwatch.StartNew(); 
    using (TextWriter output = File.CreateText("foo.txt")) 
    { 
     foreach (DictionaryEntry pair in data) 
     { 
      output.Write((string)pair.Key); 
      output.Write('\t'); 
      output.WriteLine((string)pair.Value); 
     } 
     output.Close(); 
    } 
    watch.Stop(); 

Очевидно, что производительность будет зависеть от размера фактических данных получения письменного.