2010-07-23 3 views
1

Я пишу приложение в vb.net 2005. Приложение читает электронную таблицу в DataSet с ADO.NET и использует столбец этой таблицы для заполнения ListBox. Когда элемент ListBox выбран, пользователю будет представлена ​​подробная информация о выбранной записи.Проблемы с огромными накладными расходами процессора

Одна часть этой информации отсутствует в DataSet. Мне нужно сравнить столбец из электронной таблицы с несколькими внешними источниками данных, чтобы определить характер рассматриваемой записи. Вот где у меня есть моя проблема.

Это сравнение должно выполнить поиск по 9,5-метровым строкам в таблице SQL на одном этапе. Я проверил, и нет никакого способа «уменьшить» запрос, поскольку я уже ищу абсолютно необходимые данные.

Что происходит, так это то, что приложение никогда явно ничего не делает. Использование ЦП достигает 100% независимо от того, что было раньше, и производительность системы становится почти невыносимо медленной.

Может кто-нибудь предложить способ, которым я могу улучшить эту ситуацию, пока этот массивный запрос запущен?

EDIT: Я изначально собирался записать содержимое строк 9.5m в таблице базы данных в текстовый файл, который я тогда читал, но после строк 6.5m я получил исключение OutOfMemoryException.

+0

Не могли бы вы уточнить, когда именно загрузка ЦП достигает 100%, т.е. что ваш код делает, чтобы вызвать это? Профилирование может помочь. – EMP

+0

Использование ЦП стремительно растет, когда приложение обращается к базе данных. Я установил его для выполнения SQL-запроса, отфильтрованного значением поля, которое я ищу. Если какие-либо результаты найдены, DataSet заполняется этими результатами, в противном случае DataSet остается Nothing. Здесь находится процессор. Я оставил его работать один или два раза, и в итоге он выдает исключение OutOfMemoryException. –

ответ

3

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

+0

ПРАВИЛЬНО! Я попробовал DataReader, и результаты появились в моей форме почти мгновенно. Значительное улучшение подхода DataSet. Спасибо за подсказку :) –

0
  1. Индекс в колонке для поиска?
  2. Новое поле в таблице, чтобы ускорить поиск?
+0

1. Мне нужно выполнить поиск по определенному столбцу, и я это делаю. 2. Можете ли вы рассказать о новом поле в таблице, чтобы ускорить поиск? База данных содержит информацию о клиенте компании, и мне нужно пройти несколько утверждений, прежде чем я смогу внести изменения в схемы таблиц. Зная моего начальника, я очень сомневаюсь, что он увидит, что это необходимо. –

+0

Если поиск похож на Color = 'Red', вы можете добавить целочисленный столбец, в который вы можете вставить, перечислены возможные значения Color, или, в Oracle, может помочь растровый индекс. – onof

+0

'SELECT TelephoneNumber, FirstName FROM Clients WHERE TelephoneNumber = '" & CallData.Tables (0) .Rows (i) (2) .ToString & "'" '- это мой оператор select. Я выбираю по номеру телефона, потому что это только информация из этой таблицы, которая у меня есть в электронной таблице. Идея состоит в том, что если число в электронной таблице появляется в этой таблице, то вызов, указанный в электронной таблице, не был личным вызовом, потому что вызов был сделан на число, указанное на клиенте подробнее –

Смежные вопросы