2012-11-08 3 views
0

대용량 데이터 (때때로 1 백만개 이상의 데이터 포인트)를 저장하기 위해 배열을 사용하는 코드가 있는데 동적으로 정의 할 수 있기 때문에 배열을 사용합니다. 2 방향으로 움직이며 특정 위치에 값을 삽입 할 수 있습니다. 그러나 내가 Redim을 사용하여 배열의 크기를 변경할 때 RAM에 배열의 복사본이 만들어져 결국 RAM이 부족 해지는 것을 발견했습니다. 배열을 제거하고 RAM을 절약하는 데 Erase을 사용하면 Redim을 사용하여 새 배열을 만들 수 있습니다. 그러나 두 번째 배열을 만들고 수동으로 데이터를 복사하지 않는 한, 즉, 내 데이터를 보관할 위치가 없습니다.배열 대신 사용하는 클래스 또는 재분할 및 저장 방법

Redim에는 RAM을 잃지 않고 배열을 배열 할 수 있지만 수동으로 새로운 배열로 복사 한 후 다시 가져 오는 것이 아니라보다 효율적인 데이터 보관 방법이 있습니다. 또는 위의 요구 사항을 충족하는 배열 대신 데이터를 보유 할 수있는 또 다른 클래스가 있습니다.

일부 코드는 샘플 코드를 요청하십시오. 이 방법으로 배열을 사용하여 당신의 도움이

+0

... 결국 RAM이 부족합니까? 메모리 누수에 대해 이야기하고 있습니까? 어떻게이 일을하고 있는지 보여 주실 수 있습니까 (코드)? 메모리 누출이 아니라면 데이터 세트가 커질 때 RAM에 두 개의 복사본을 저장할 공간이 없다고 말하고 있습니까? –

+0

나는 이것이 메모리 누출이 아니라고 확신한다. 나는 Redim Preserve와 Redim을 수백만 레코드가 여러 번 배열에 사용하고있었습니다. 나는 단지 배열을'지우기'와'Redim'으로 코드를 업데이트했고, 이제는 RAM 오류를 얻는데 사용 된 데이터 양의 두 배에 대해 작동합니다. – Pezzzz

답변

1

에 대한

많은 감사는 매우 메모리 효율적이지 않습니다.

당신은 List(of T) 사용하는 것이 좋을 것이다는 각 데이터 포인트를 보유 할 클래스를 사용할 수 있습니다이 경우 this answer for reasons why

에서보세요. List of (T of)를 사용하면 작성중인 전체 데이터의 사본없이 목록의 중간에 삽입 할 수 있습니다.

'Define your datapoint class 
Private Class DataPoint 
    Public Property X As Long 
    Public Property Y As Long 
    Public Sub New(ByVal X As Long, ByVal Y As Long) 
     Me.X = X 
     Me.Y = Y 
    End Sub 
End Class 

'create and initialise the list 
Dim MyDataPoints As New List(Of DataPoint) 
'add some data to it 
MyDataPoints.Add(New DataPoint(1, 2)) 
MyDataPoints.Add(New DataPoint(1, 2)) 
MyDataPoints.Add(New DataPoint(4, 3)) 
'Now insert a new datapoint at an arbitrary position in the list 
MyDataPoints.Insert(2, New DataPoint(5, 6)) 
+0

확실히 메모리 효율적인 것은 아닙니다. 수백만 개의 객체를 만들고 GC에 큰 부담을 줄 것이며 인스턴스 당 적어도 8 바이트를 더 많이 사용하게 될 것입니다. 따라서 16 바이트 (2 Long)를 사용하는 대신 인스턴스 당 24 바이트, 50 % 증가 그러나 DataPoint를 대신 구조로 만들면 훨씬 더 좋아질 것입니다. –

+0

데이터를 효율적으로 보관하는 데 메모리를 효율적으로 사용할 필요가 없습니다. 데이터를 보유하는 클래스의 크기를 다시 조정하는 메모리 효율적인 방법이 필요합니다. 현재 목록의 목록으로 새 클래스를 작성하는 중입니다. 문제의 해결 방법 인 것 같습니다. – Pezzzz

관련 문제