2010-08-03 2 views
0

У меня есть программа, написанная на asp.net с lucene.net. Сначала я создаю индекс из 28000 документов. Во-вторых, я выполняю поиск, но иногда возникает ошибка. (Я думаю, что эта ошибка возникает, когда есть много результатов)System.OutOfMemoryException

важная часть кода:

Dim hits As Hits = searcher.Search(query) 
Dim results As Integer = hits.Length() 'ergebnisse (größe der hits) 

'##################### 
'####### RESULTS ##### 
'##################### 

trefferanzahl = results 

If (results > 0) Then 
    Dim i As Integer 
    Dim h As Integer = results - 1 
    ReDim array_results(h, 6) 'array zum speichern von den "feldern" 
    Dim cellX As New TableCell() 

    For i = 0 To results - 1 Step 1 

     Dim tmpdoc As Document = hits.Doc(i) ' HERE THE ERROR! 
     Dim score As Double = hits.Score(i)  

     MsgBox("2. Docname: " & hits.Doc(i).Get("title")) 


     array_results(i, 0) = tmpdoc.Get("title") 
     array_results(i, 0) += tmpdoc.Get("doc_typ") 
     array_results(i, 1) = tmpdoc.Get("pfad") 
     array_results(i, 2) = tmpdoc.Get("date_of_create") 
     array_results(i, 3) = tmpdoc.Get("last_change") 
     array_results(i, 4) = tmpdoc.Get("id") 
     array_results(i, 5) = tmpdoc.Get("doc_typ") 
     array_results(i, 6) = CStr(score) 
    Next 

    ' Load this data only once. 

    ItemsGrid.DataSource = CreateDataSource() 
    ItemsGrid.DataBind() 
Else 
    bool_Suchergebnis = False 
End If 

searcher.Close() 

Заранее спасибо

+1

Вы по-прежнему получаете сообщение об ошибке, если вы удаляете переменную tmpdoc и заменяете ее «hits.Doc (i)»? –

ответ

3

Хороший принцип при выполнении поиска accross очень большие коллекции заключается в ограничьте результаты, которые вы обрабатываете как можно скорее. Я предполагаю, что вы реализуете пейджинг в своей сетке. И давайте предположим, что PageSize is 20.

Что вам нужно сделать, так это убедиться, что у вас есть доступ к PageSize и текущему PageNo в этом методе. Затем используйте Linq по набору результатов для Take (PageSize) и Skip (PageNo * PageSize). Тогда вам нужно будет обработать только 20 записей.

Затем у вас есть два варианта. Если вы привязываетесь непосредственно к массиву, вы можете уйти с пустыми элементами, но я не уверен, поэтому вам, возможно, придется помещать фиктивные элементы в массив данных в любых позициях, которые не будут отображаться. Не идеальный, но, конечно, быстрее, чем обработка 1000 хитов.

Второй вариант заключается в том, чтобы привязать только 20 элементов к сетке, что будет быстро, отключить пейджинг в сетке, поскольку он будет показывать только одну страницу, а затем реализовать свое собственное поведение подкачки, как вы знаете, PageSize, и текущий PageNo. Это потребует больше работы, но оно будет выполнять намного быстрее, чем привязка привязки к большому источнику данных.

И это поможет вам решить проблему с памятью.

+0

Благодарим вас за очень полезный ответ, я жду доступа к изменению программы на сервере ... когда я смогу это сделать, я проверю ваш комментарий. И я должен ограничить результаты из-за использования нескольких страниц, например Google. большое спасибо – tim

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