System.OutOfMemoryException
У меня есть программа, написанная на asp.net с lucene.net. Сначала я создаю индекс из 28000 документов. Во-вторых, я выполняю поиск, но иногда возникает ошибка. (Я думаю, что эта ошибка выдается, когда есть много результатов)
Важная часть кода:
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 ответ
Хороший принцип при выполнении поиска по очень большим коллекциям - как можно скорее ограничить результаты, которые вы обрабатываете. Я предполагаю, что вы используете пейджинг в своей сетке. И давайте предположим, что PageSize равен 20.
Что вам нужно сделать, это убедиться, что у вас есть доступ к PageSize и текущему PageNo в этом методе. Затем используйте Linq для набора результатов: Take(PageSize) и Skip (PageNo * PageSize). Тогда вам нужно будет обработать только 20 записей.
Тогда у вас есть два варианта. Если вы привязываете напрямую к массиву, вы можете избежать пустых элементов, но я не уверен, поэтому вам, возможно, придется помещать фиктивные элементы в массив источника данных во всех позициях, которые не будут отображаться. Не идеально, но, конечно, быстрее, чем обработка тысяч хитов.
Второй вариант - привязать только 20 элементов к сетке, что будет быстро, отключите подкачку на сетке, так как она покажет только одну страницу, а затем реализуйте свое собственное поведение подкачки, как вы знаете PageSize, и текущий PageNo. Это займет больше работы, но будет работать намного быстрее, чем готовая привязка сетки к большому источнику данных.
И это поможет вам решить вашу проблему с памятью.