Страница: 1 |
Страница: 1 |
Вопрос: Ускорение работы с DBF-базой
Добавлено: 05.11.05 19:12
Автор вопроса: pashaq2000 | Web-сайт:
как ускорить чтение из 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 работает медленней твоего способа?
 ata1.Recordset.Move (i)
Да не в жизни не поверю! Ты на каждой итерации возвращаешься на первую строчку затем переходишь на нужную! Зачем?????
Идем дальше.. При большом количестве данных и тем более в цикле предпочтительнее использовать конструкцию With - End With. Это заметно сократит время доступа к объекту на большом количестве строк.И если настолько критично время доступа,то я бы рекомендовал при считывании данных обращаться к полям строки по индексу, а не по названию. Это тоже сократит время.В итоге твой участок кода должен выглядеть примерно так.
.Move(5)
Do Until .EOF
MD.NS = .Fields(0)'Индексы поставь свои
MD.DS = .Fields(1)
.MoveNext
Loop
End With
И еще... Всем давно известно,что встроенный компонент Data-тормознутый! Лучше переходи на DAO/ADO