Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Ускорение работы с DBF-базой Добавлено: 05.11.05 19:12  

Автор вопроса:  pashaq2000 | Web-сайт: нет | ICQ: 216117684 
как ускорить чтение из DBF-файла?
В базе есть поле NS - Номер сообщения, и нужно считывать определенное сообщение, как быстрее всего можно его считать, и как быстрее начиная с этого сообщения до конца файла?


Dim MD As MasDat 'свой тип данных

Data1.DatabaseName = App.Path & "\base"
Data1.RecordSource = "5.dbf"
Data1.Refresh
N=5 ' с этого сообщения надо считывать и до конца
For i = N To Data1.Recordset.RecordCount - 1
  Data1.Recordset.MoveFirst
  Data1.Recordset.Move (i)
  MD.NS = Data1.Recordset.Fields("NS").Value
  MD.DS = Data1.Recordset.Fields("DS").Value
Next i


Всё работает, но очень медленно, проц загружается на 100%, а считывается медленно.

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 05.11.05 19:57
Ну ещё бы...
На каждой итерации movefirst, а потом обратно...
Про movenext слышали?..


ЗЫ: а ты знаешь, что порядок записей в файле не отражает их смысла?

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 05.11.05 23:43
К сожалению с dbf-базами не работал, но по аналогии с другими базами, если надо быстро считать большой объем данных, то как правило используют специальные курсоры,кторые позволяю считывать данные в режиме ReadOnly, и соответственно двигаться по записям только вперед.

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 05.11.05 23:50
Если не ошибаюсь(пускай меня поправят),то такой курсор называется Snapshot. Но тут есть одно НО. Он не позволит тебе внести изменения в БД, зато ты получишь выигрыщ в скорости.

Ответить

Номер ответа: 4
Автор ответа:
 pashaq2000



ICQ: 216117684 

Вопросов: 13
Ответов: 29
 Web-сайт: нет
 Профиль | | #4
Добавлено: 06.11.05 15:56
Про movenext знаю пробовал Тоже медленно работает!
А поподробней про SnapShot и ReadOnly Где посмотреть?

Ответить

Номер ответа: 5
Автор ответа:
 pashaq2000



ICQ: 216117684 

Вопросов: 13
Ответов: 29
 Web-сайт: нет
 Профиль | | #5
Добавлено: 06.11.05 16:01

Самое интересное данные в базу записываются около минуты а на считывание уходит минут 5 не меньше. Используется movenext!!!!!!!!!!!

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 06.11.05 19:03
Ты хочешь сказать,что MoveNext работает медленней твоего способа?
  ;Data1.Recordset.MoveFirst
  ;Data1.Recordset.Move (i)

Да не в жизни не поверю! Ты на каждой итерации возвращаешься на первую строчку затем переходишь на нужную! Зачем?????
Идем дальше.. При большом количестве данных и тем более в цикле предпочтительнее использовать конструкцию With - End With. Это заметно сократит время доступа к объекту на большом количестве строк.И если настолько критично время доступа,то я бы рекомендовал при считывании данных обращаться к полям строки по индексу, а не по названию. Это тоже сократит время.В итоге твой участок кода должен выглядеть примерно так.

With Data1.Recordset
  .Move(5)
  Do Until .EOF
    MD.NS = .Fields(0)'Индексы поставь свои
    MD.DS = .Fields(1)      
    .MoveNext
  Loop
End With


И еще... Всем давно известно,что встроенный компонент Data-тормознутый! Лучше переходи на DAO/ADO

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам