2011-07-26 11 views
6

Tôi mới dùng Khuôn khổ .NET Entity và đang cố gắng lặp qua các bản ghi trong một bảng có vài triệu hàng. Đây là mã cơ bản:Truy vấn khung khuôn mẫu truy vấn xuất hiện ngoài ý nghĩa

// select the records from the database 
var records = from data in dataContext.Messages 
       select data; 

// iterate over the messages 
foreach (var record in records) 
{ 
    // do nothing 
} 

Trong khi lặp qua dữ liệu, tôi nhận được 'nhận thức vượt trội'. Có một số cách mà tôi có thể thay đổi truy vấn của tôi hoặc quản lý bộ nhớ của cá thể ObjectQuery?

+0

bạn làm gì bên trong vòng lặp đó? – Tigran

+0

Bản sao có thể có của [Bộ khung dữ liệu lớn của thực thể, ngoại trừ bộ nhớ ngoài] (http://stackoverflow.com/questions/18169859/entity-framework-large-data-set-out-of-memory-exception) –

Trả lời

4

tôi nghi ngờ vấn đề là Entity Framework đang cố gắng để bộ nhớ cache/theo dõi tất cả dữ liệu này trong ngữ cảnh đối tượng, mà cuối cùng gây ra ngoại lệ OutOfMemory nếu tập dữ liệu là rất lớn.

Bạn có thể bật theo dõi tắt bằng tay để tránh tình trạng này:

dataContext.Messages.MergeOption = System.Data.Objects.MergeOption.NoTracking; 

Bộ nhớ được phân bổ mà bạn đang nhìn thấy là trong bối cảnh dữ liệu - bộ nhớ này cuối cùng sẽ được thu gom rác thải một khi bạn vứt bỏ bối cảnh, vì vậy cách khác bạn có thể thực hiện các lô hàng nhỏ hơn bên trong một khối sử dụng hoặc xử lý thủ công ngữ cảnh đối tượng để lấy lại bộ nhớ giữa mỗi lô.

+1

Đặt MergeOption to NoTracking đã khắc phục sự cố. Cảm ơn bạn. – mdeangelo272

+0

Tôi đặt cấu hình này ở đâu? Ở lớp nào? – jairhumberto