System.OutOfMemoryException - PullRequest
       20

System.OutOfMemoryException

0 голосов
/ 03 августа 2010

У меня есть программа, написанная на 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 Ответ

3 голосов
/ 03 августа 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...