Tôi có một vấn đề đã làm phiền tôi bây giờ trong một vài ngày. Tôi đã cố gắng để Google vấn đề, nhưng cho đến nay đã không thể tìm thấy bất kỳ giải pháp, thậm chí không phải là một người duy nhất với cùng một vấn đề.C# System.Buffer.BlockCopy Memory Issue?
Dường như phương pháp C# System.Buffer.BlockCopy để lại cho bạn một số loại bóng ma bộ nhớ. Ví dụ: tôi có ví dụ:
private float[,] readFloatArray2 (byte[] b) {
int floatSize = sizeof(float);
float[,] v = new float[2, (b.Length/2)/floatSize];
System.Buffer.BlockCopy(b, 0, v, 0, b.Length);
return v;
}
để chuyển mảng byte sang mảng nổi 2D. Dữ liệu trước đây được đọc từ một luồng. Tôi đã đặt vấn đề là phương thức System.Buffer.BlockCopy.
Nếu tôi xóa lệnh BlockCopy, bộ nhớ được ứng dụng sử dụng sẽ bằng một nửa kích thước. điều này có nghĩa rằng không phải lỗi của tôi mà mảng byte vẫn còn sống. bởi vì không có lệnh BlockCopy, mảng byte chết đúng cách. mảng float được tạo ra dù sao (có hoặc không có thông tin được sao chép).
Tôi không hoàn toàn chắc chắn nếu đây là một vấn đề của lệnh BlockCopy hoặc GC vì tôi cũng đã cố gắng gọi System.GC.Collect(); sau khi BlockCopy và sau đó nó cũng hoạt động hoàn hảo (tôi biết bạn không nên làm điều này ... đó là lý do tại sao tôi yêu cầu tư vấn ở đây).
Tôi cũng sẽ không bận tâm hỏi, nhưng vấn đề liên quan đến vài trăm meg.
Bên cạnh các vấn đề về bộ nhớ, phương thức hoạt động hoàn toàn tốt. Có ai biết điều gì gây ra vấn đề bộ nhớ?
lời chào và cảm ơn trước oli
ps: Tôi đang sử dụng .NET4.0 với Visual Studio 2010 PRO và WIN7 ... không biết liệu điều này có liên quan hay không.
Nếu bạn nói bộ nhớ được thu thập đúng cách bởi một 'GC.Collect' sau đó mọi thứ đều tốt. 'b' * sẽ * cuối cùng được thu thập bởi một GC bình thường khi thời gian đến. –
Nếu bạn đang làm việc trên dữ liệu âm thanh, tôi muốn sử dụng một mảng lởm chởm của dạng 'float [len] [channelCount]'. Bằng cách đó bạn có thể xử lý các kênh riêng biệt, điều này đôi khi hữu ích. – CodesInChaos
"mảng float được tạo anyway" Chỉ một nửa sự thật. Nó không nhất thiết cần bộ nhớ vật lý. Các trang bộ nhớ là tất cả 0 và chưa bao giờ được ghi vào, được tối ưu hóa bởi trình quản lý bộ nhớ cửa sổ. – CodesInChaos