Read huge table with LINQ to SQL: Running out of memory vs slow paging

后端 未结 1 1876

I have a huge table which I need to read through on a certain order and compute some aggregate statistics. The table already has a clustered index for the correct order so g

1条回答
  •  無奈伤痛
    2021-01-01 03:53

    After madly grasping at some straws, I found that the DataContext's ObjectTrackingEnabled = false could be just what the doctor ordered. It is, not surprisingly, specifically designed for a read-only case like this.

    using (var readOnlyDataContext = 
        new MyDataContext(_conn) {CommandTimeout = really_long, ObjectTrackingEnabled = false})
    {                                                 
        var logs =
            (from record in readOnlyDataContext.someTable
             where [index is appropriate]
             select record);
    
        foreach( linqEntity l in logs )
        {
            // Do stuff with data from l   
        }                
    }
    

    The above approach does not use any memory when streaming through objects. When writing data, I can use a different DataContext that has object tracking enabled, and that seems to work okay. However, this approach does have the problem of a SQL query that can take an hour or more to stream and complete, so if there's a way to do the paging as above without the performance hit, I'm open to other alternatives.

    A warning about turning object tracking off: I found out that when you try to do multiple concurrent reads with the same DataContext, you don't get the error There is already an open DataReader associated with this Command which must be closed first. The application just goes into an infinite loop with 100% CPU usage. I'm not sure if this is a C# bug or a feature.

    0 讨论(0)
提交回复
热议问题