На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Чтение текста из файла в фоне , КПК!!! C# .net cf2.0
    Итак. Кто читал мои прошлые темы, с базами данных не получилось - медленно ведется поиск.

    Выход - работать через файлы.

    C файлов читаются строки формата
    имя*фамилия*допинфо
    имя*фамилия*допинфо
    ...
    имя*фамилия*допинфо

    Они пихаются в класс
    ExpandedWrap disabled
      class man
      {
      public String name;
      public String sname;
      ...
      public String dopinfo;
      }


    Создается
    ExpandedWrap disabled
      ArrayList mans


    В котором происходит поиск
    ExpandedWrap disabled
      String s="вася";
      foreach (man i in mans)
      {
         if (i.dopinfo.indexof(s)>-1)
           Console.Writeline(i.dopinfo);
      }


    Файлы с этими данными большие - в сумме около 3 Мб. Для кпк ноша большая. Если читать инфу из файлов в КПК при запуске, этот процесс займет 15-20 секунд. Читаю как бинарник.

    Вопрос - как можно загрузить данные (можно в фоне) чтобы это не сильно отразилось на работе КПК? И побыстрее загрузить )
      а у тебя есть чем занять юзера, пока жаные грузятся?
        У меня программа с векторной картой. Т.е. 4-5 секунд она грузится, потом по ней можно перемещаться. ПРичем, перемещение тоже процессор кушает. ПРедполагается, юзер сперва перемещаться будет по карте. Потом уже в базу полезет
          А тебе обязательно надо всё загружать или юзеру вероятнее всего понадобится один-два человека из эти 3х метров данных?
            Будет вестись поиск. ПОиск должен проходить естественно по всем человекам.
            Может, если в ресурсах искать будет быстро?
              Можно попробывать ничего не грузить, а для ускорения поиска использовать индекс
              Тоесть сделать заранее ещё один файлик в котором будут храниться смещения в файле данных для каждой персоны.
              Найти персону в индексе быстро, так как они там упорядочены и там только информация, которя может считаться ключевой (уникальна для каждой персоны).
              Найдя в индексе персону - читаем данные уже в файле даных по известному смещению.
              Тобишь своя простенькая СУБД получится.

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

              Добавлено
              Да, канечно можно грузить файл в фоне (с заданной скоростью, чтоб не тормазило). Но ведь если ты работаешь на КПК - три метра оперативы - тоже трагично.
              Сделать саму загрузку не сложно, но потом ведь выплывут всякие там ситуаци "не готовых данных"...
                Вот как ее сделать? =) Если что с памятью проблем нет
                  создаёшь буфер какого надо размера.
                  читаешь туда информацию кусками.
                  а из буфера - уже куда надо копируешь.
                  То что успело загрузиться уже можно использовать.
                  Как сделать так чтоб загрузка не мешала работе?
                  тут 2 варианта -
                  1. грузитьт будет нитка с низким приоритетом (приоритеты нитей будут работать на кпк?)
                  2. сделать буфер маленьким и грузить туда инфу по таймеру :) тоже нить, но без приоритетов

                  Второй вопрос - как использовать даные.
                  тут тоже варианты:
                  1. грузим ВСЁ в память и потом разбираем всякими циклами.
                  2. продумать получше нить (и класс, её инкапсулирующий) загрузки - пусть генерит событие каждый раз, когда загружена целая запись из файла.
                    Смотри. Я могу позволить себе сделать такую вещь - в программе загрузить stream файла в память. И потом его парсить. Как показала практика - парсинг занимает большую часть времени. Можно ссылку или пример как форкнуть поток и в нем читать имеющийся stream?
                      Форкать поток не надо. Надо написать функцию, которая выполнает загрузку. Потом создать нить и приказать ей выполнять эту функцию.
                      Или CompactFramework не поддерживает нитей???
                        Покажи как нить создать. ПРоверю.
                          Внесу свои 5 копеек.
                          мне кажется что лучшее что тут нужно сделать это индексный файл.
                          для этого он и задумывался собственно - для оптимизации поиска.

                          http://www.codenet.ru/webmast/search/newbee/
                          Сообщение отредактировано: Mr_Smith -
                            Цитата Mr_Smith @
                            мне кажется что лучшее что тут нужно сделать это индексный файл.

                            согласен, но

                            Цитата Slukad @
                            C файлов читаются строки формата
                            имя*фамилия*допинфо

                            тоесть что будет индексом? имя-фамилия? тогда индекс записи будет всего то в 2 (в лучшем случае!) раза меньше одной записи.
                            Толку то мало тогда.
                            Хотя, Slukad-у видне, какие у него там данные.
                              Цитата Slukad @
                              Файлы с этими данными большие - в сумме около 3 Мб. Для кпк ноша большая. Если читать инфу из файлов в КПК при запуске, этот процесс займет 15-20 секунд. Читаю как бинарник.

                              Вопрос - как можно загрузить данные (можно в фоне) чтобы это не сильно отразилось на работе КПК? И побыстрее загрузить )

                              Может, воспользоваться СУБД? На windows ce вполне запускаются sqlite и sql server compact.
                                Цитата Slukad @
                                Покажи как нить создать. ПРоверю.

                                ExpandedWrap disabled
                                  void myFunc(){
                                  // здесь пищнм действия, которые должна выполнить нить
                                  ...
                                   
                                  // как только выполнение дойдёт до сюда - нить завершится
                                  }
                                   
                                  void Main()
                                  {
                                              System.Threading.Thread t = new System.Threading.Thread(myFunc);
                                              t.Priority = System.Threading.ThreadPriority.Lowest;
                                              t.IsBackground = true;
                                              t.Start();
                                   
                                  }

                                Если ты не умеешь создавать нить - то, скорее всего не знаешь проблем, связанных с многопоточным программированием.
                                Лучше поднять маленько теорию, прежде чем браться.
                                Хотябы усяни для себя что такое синхронизация и чем её едят.

                                А про СУБД - подумай.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0616 ]   [ 17 queries used ]   [ Generated: 9.05.24, 01:46 GMT ]