2011-03-31 2 views
10

서버에서 스트리밍되는 라이브 데이터로 많은 재무 차트를 표시하는 응용 프로그램 (C#, WPF)이 있습니다. 메모리에 수집 된 데이터는 조금 커질 수 있으며 디스크에 데이터를 보관하고 싶지는 않습니다.더 나은 성능을 위해 메모리 내 C# 개체를 압축해야합니까?

이전 데이터 자체는 변경되지 않지만 추가 된 데이터 만 (컬렉션 개체에 저장된) 데이터를 압축 된 형식으로 유지하는 것이 맞습니까?

누구나 가능하면 좋은 연습을 추천 할 수 있습니까? 내가 그 압축 데이터를 액세스 지연을 추가 할 것입니다 알고 있지만, 사용자는 도착하는 새로운 데이터에 대한 빠른 업데이트를 필요로 :

성능과 트레이드 오프에 대한 몇 가지 메모를

UPDATE. 이미 렌더링 된 데이터 (예 : 연구 또는 다시 렌더링)에 액세스 할 때 빠른 응답이 필요하지 않습니다.

+1

"큰"이라고 말하면 얼마나 큰 소리입니까? – HABJAN

+0

@HABJAN은 MB 또는 100의 10 분의 1 일 수 있습니다. 이유가 무엇입니까? 기본적으로이 양의 데이터를 처리하는 "문제"는 아니지만 앱의 메모리 사용 공간을 최대한 작게 유지하려고합니다. – Saul

+0

산업용 솔루션을 사용하는 것이 좋습니다. 하나의 예는 인 - 메모리 스토리지로서 훌륭한 KDB 데이터베이스입니다. – Andrey

답변

13

압축 및 압축 해제로 인해 응용 프로그램의 속도가 느려지므로 성능 (속도)이 좋지 않습니다. 압축은 사용 가능한 메모리가 걱정되는 경우에만 유용합니다. 데이터를 임시 폴더에 저장/스왑하는 것이 더 쉬울 수 있습니다.

성능의 핵심은 측정입니다. 당신이 그 숫자를 강타 할 때 행동을 취하십시오.

+0

@Erno하지만 표시되었지만 이전 데이터에 액세스 할 수있는 곳이 거의 없으므로 여기서 실적 가격은 무엇입니까? – Saul

+0

메모리의 데이터 압축을 제안했습니다. 압축 된 데이터를 표시하려면 압축을 풀어야합니다. 시간이 필요해. 확실히 표시하고 더 이상 액세스 할 필요가 없을 때 압축 할 수 있지만 더 이상 필요가 없으면 단순히 제거하지 않는 것이 좋습니다. 다시 먼저 측정 한 다음 수학을 시작하고 조언을 구하십시오. 그때까지는 우리는 단지 짐작하고 있습니다. –

+0

@Erno 감사합니다. 측정 하겠지만 현재 다른 응용 프로그램에서이 문제를 알고 있습니다. 토론을 위해 : 나는 그것을 액세스해야하기 때문에 그것을 버리고 싶지 않습니다, 그리고 나는 그것을 다시 다운로드하고 싶지 않습니다. 내가 그것을 액세스 할 때, 나는 지연의 대가를 지불 할 수는 있지만 (대역폭은 아님). 차트를 한 번 렌더링하고 데이터를 압축 한 다음 새로운 데이터가 도착하면 차트를 업데이트하는 것으로 생각했습니다. – Saul

6

데이터를 압축하는 것은 메모리 사용 측면에서 장점이 있지만 데이터를 사용할 수 없게 만드는 단점 (추가로 사용하려면 압축을 풀어야 할 필요가 있음)과 추가 CPU를 차지하는 단점.

이 정보가 도움이 될 수있는 절충점은 더 많은 정보 없이는 알기가 어렵습니다. 귀하에게 달려 있습니다. 그러나이 오래된 오래된 데이터를 사용하지 않는 경우 압축하지 말고 폐기하십시오 (예 : 범위를 벗어나 저장을 중단하십시오).

압축은 System.IO.Compression의 클래스를 통해 수행 할 수 있으며 매우 쉽습니다. 그러나 이러한 클래스는 일반적으로 잘 수행되지 않으므로 DotNetZip과 같은 제 3 자 대안을 고려할 수 있습니다.

+0

Erno에 쓴대로, 나는이 데이터를 가끔씩 빠른 응답이 필요하지 않은 시간에 사용할 것입니다. 매번 다운로드해야하고 대역폭이 더 비싸기 때문에 버리길 원하지 않습니다. – Saul

+0

@Saul : 그러면 디스크 기반 캐시가 잠재적으로 적절한 옵션처럼 보입니다. 압축은 당신에게 엄청난 메모리를 절약 할 수는 없지만 CPU 사용량은 상당히 높습니다. –

+0

.NET 4.0을 사용하는 경우 메모리 매핑 파일을 사용하여 기록 데이터를 저장하는 것이 좋습니다. VMM은 데이터를 얻기 위해 전체 파일을 읽지 않아도 디스크의 파일을 이동할 수 있습니다. –

1

성능과 메모리 사용량간에 균형이 맞지 만 사용중인 데이터 구조에 따라 다릅니다. "일반"압축 (즉, gzip, run-length 인코딩 등)은 많은 유형의 데이터에 적합하지 않습니다.

을 선택하면 메모리 풋 프린트를 최적화하는 데이터 구조을 선택할 수 있습니다. 즉, 차트에 대해 독립적 주가를 저장해야합니까? 아니면 델타 값을 저장하여 살 수 있습니까? 이후가 사실이라면 각 데이터 요소에 필요한 비트를 줄일 수 있습니다. 또 다른 것은 모든 차트에서 필요한 패턴을 다시 발생시키는 것입니다. 모든 차트에서 사용되는 별도의 개체에서이를 제외하고 한 번만 인스턴스화 할 수 있습니까?

0

더 나은 성능을 원하는 경우 압축을 사용하는 것은 아닙니다. 클라이언트 호스트가 데이터를 처리하기에 충분한 메모리를 가지고 있다면 데이터를 압축하지 않은 상태로 유지하면 성능이 최대가됩니다. 데이터를 압축하려면 데이터에 액세스 할 때마다 압축 해제 알고리즘과 압축 알고리즘이 필요합니다.

클라이언트 호스트에서 메모리가 부족한 경우 저장된 데이터를 압축해야하는 상황에 처하게됩니다.그러나 데이터가 압축되고 가비지 콜렉션이 압축되지 않은 메모리 오브젝트를 수집 할 때만 메모리를 절약 할 수 있습니다. 데이터를 활용하려면 압축을 풀 필요가 있기 때문에 클라이언트 RAM을 최대한으로 활용할 수있는 솔루션을 제공하지 못합니다.

이 모든 것을 염두에두면 .NET은 gzip 압축을 수행하기위한 System.IO.Compression 네임 스페이스를 제공합니다. 당신이 압축을 필요로한다면 나는 거기를보고 시작할 것입니다.

0

직접 코드를 작성하려는 경우 디코딩/압축 해제가 필요하지 않은 공간 효율적인 데이터 구조가 존재합니다. 그의 최신 블로그 포스트에서 Steve Hanov describes Succinct Data Structures. 그의 예는 간결한 trie이지만 다른 물건과 구조를 나타내는 것을 막을 수있는 방법은 없습니다. 그는 몇 가지 대안을 제시합니다.

당연한 말로, 이것은 out-of-the-box 솔루션이 아닙니다. 간결한 표현을 작성하고 테스트 할 가치가 있는지 판단해야합니다.

관련 문제