为System.OutOfMemoryException

时间:2010-08-03 07:42:59

标签: asp.net lucene.net out-of-memory

我有一个用lucene.net编写的asp.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 个答案:

答案 0 :(得分:3)

在非常大的集合中执行搜索时,一个很好的原则是尽快限制您正在处理的结果。我将假设您正在网格中实现分页。我们假设PageSize是20。

您需要做的是确保您可以访问此方法中的PageSize和当前PageNo。然后在结果集中使用Linq到Take(PageSize)和Skip(PageNo * PageSize)。然后你只需要处理20条记录。

然后,您有两个选择。如果直接绑定到数组,您可能可以使用空项,但我不确定,因此您可能必须将虚拟项放入数据源数组中所有不会显示的位置。不理想,但肯定比处理1000次点击更快。

第二个选项是只将20个项目绑定到网格,这将是快速的,关闭网格上的分页,因为它只显示一个页面,然后实现自己的分页行为,因为你知道PageSize,和当前页面。这将需要更多的工作,但它将比开箱即用的gridview绑定到大型数据源的执行速度快得多。

它将帮助您解决记忆问题。