none
XML создание "библиотеки" с# RRS feed

  • Вопрос

  • Цель создать "библиотеку" типа:
    для слова ааа будет выглядеть

    <root>
      <a>
       <a>
        <a>
         aaa
        </a>
       </a>
      </a>
    </root>
    

    Все работает как нужно, но время создания.... 100 тыс слов ...3 часа..., а нужно 10 000 000 =)) (может есть идейки как оптимизировать=))

    Основной класс:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.IO;
    
    namespace CreationLib_test3
    {
      public class myClass
      {
        public myClass()
        {
          CreationWords CW = new CreationWords();
          string path = "Library3.lib";
          Console.WriteLine("Открытие библиотеки {0}", path);
    
          XmlDocument document = new XmlDocument();
    
          bool pLoad = false;
    
          try
          {
            document.Load(path);
            Console.WriteLine("Библиотека открыта.");
          }
          catch
          {
            Console.WriteLine("Не смогли открыть...");
            using (StreamWriter sw = File.CreateText(path))
            {
              sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
              sw.WriteLine("<words>");
              sw.WriteLine("</words>");
            }
            Console.WriteLine("Создали новую...");     
            document.Load(path);
            Console.WriteLine("Открытие...");
          }
    
          XmlNode root = document.DocumentElement;
    
          Console.WriteLine("Создание библиотеки...");
          DateTime startTime = DateTime.Now;
          #region create
          for (int y = 0; y < 100000; y++)
          {
            string s = CW.World();
            //Console.WriteLine("Слово для добовления: {0}", s);
            string code = "//words";//root структура
            for (int i = 0; i < s.Length; i++)
            {
              code += "/" + s[i];
            }
    
            XmlNode node = root.SelectSingleNode(code);
            XmlText ss = document.CreateTextNode(s);
            int index = 0;
            if (node == null)
            {
              code = code.Remove(code.Length - 1 - 1); //вместо одного можно возвращать маску длинны на эту букву + "/" (1)
              index = 1;
              node = root.SelectSingleNode(code);
    
    //--------------------
    //Вот это тяжелое место... возможно я изобретаю велосипед....
              while (true)
              {
                if (node != null && code.Length >= 5)
                {
                  //Console.WriteLine("По нашему запросу найдена структура: {0} | index={1}", code, index.ToString());
                  break;
                }
                //Console.WriteLine("Ищем по древу структуру: {0}", code);
                code = code.Remove(code.Length - 1 - 1);
                node = root.SelectSingleNode(code);
                index += 1;
              }
    //--------------------
    
              //Console.WriteLine("Находимся в структуре: {0}", code);
    
              if (node != null)
              {
                //Console.WriteLine("Достраиваем структуру (index={0} root={1}):", index, code);
                //Достраиваем структуру
                for (int i = index; i > 0; i--)
                {
                  //Console.WriteLine("CreateElement: {0}", s[s.Length - i].ToString());
                  XmlElement newNode = document.CreateElement(s[s.Length - i].ToString());
                  node = node.InsertAfter(newNode, node.LastChild);
                }
                //Добовляем текст(структуру текста)
                //Console.WriteLine("Добовляем текст: {0}", s);
                XmlText newText = document.CreateTextNode(s);
                node.InsertAfter(newText, node.LastChild);
    
              }
            }
            else
            {
              //Если нашли такую структуру
              //Console.WriteLine("Такая структура с таким словом уже есть");
            }
          }
          #endregion
    
          Console.WriteLine("Библиотека создана.");
          Console.WriteLine("Время создание библиотеки: {0}", (DateTime.Now - startTime).ToString());
          document.Save(path);
        }
      }
    }
    
    

    21 ноября 2010 г. 6:35

Ответы

  • Достоинства XML - простота, структурированность данных. Идеально подходит для обмена данными. У Вас 100 тыс. слов, а предполагаете аж 10 млн. Вдобавок XML файл с таким объёмом данных будет очень большим по сравнению с хранимым в нём объёмом данным. Может взглянуть в сторону полновесной БД?
    • Предложено в качестве ответа PetrishkoMVP, Editor 21 ноября 2010 г. 13:24
    • Помечено в качестве ответа dampirik 22 ноября 2010 г. 16:30
    21 ноября 2010 г. 13:24
    Отвечающий

Все ответы

  • Достоинства XML - простота, структурированность данных. Идеально подходит для обмена данными. У Вас 100 тыс. слов, а предполагаете аж 10 млн. Вдобавок XML файл с таким объёмом данных будет очень большим по сравнению с хранимым в нём объёмом данным. Может взглянуть в сторону полновесной БД?
    • Предложено в качестве ответа PetrishkoMVP, Editor 21 ноября 2010 г. 13:24
    • Помечено в качестве ответа dampirik 22 ноября 2010 г. 16:30
    21 ноября 2010 г. 13:24
    Отвечающий
  • Я хотел посмотреть как быстрее будет работать поиск по XML (данной формы) слов, в сравнении с простым поиском по файлу. Не как не стандартизированным... тк в обычном виде прочитывается файл из 10 млн слов за 2 сек...

    А на скидку... какой оптимальный объем данных хранимых в одном XML файле?

    21 ноября 2010 г. 14:45
  • Поиск по xml - этот тот же поиск по тексту. 

    Оптимальный объем - понятие относительное. Какой оптимальный объем у текстового файла? 

    21 ноября 2010 г. 15:15
    Модератор