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. Это займет больше работы, но будет работать намного быстрее, чем готовая привязка сетки к большому источнику данных.

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

Другие вопросы по тегам