2011-01-27 6 views
6

본질적으로 거대한 사각형 매트릭스 인 10GB CSV 파일이 있습니다. 가능한 한 효율적으로 행렬의 단일 셀에 액세스 할 수있는 함수, 즉 행렬 [12345,20000]을 작성하려고합니다.CSV 임의 액세스; C#

크기를 감안할 때 분명히 전체 배열을 2D 배열에로드 할 수 없으므로 필자는 파일에서 직접 값을 읽어야합니다.

저는 FileStream.Seek를 사용하여 파일 임의 접근을 살펴 보았습니다. 그러나 불행히도 각 셀의 반올림 변수는 고정 폭이 아니기 때문에 봤습니다. 특정 바이트를 찾고 내가 어떤 종류의 산술에 의해보고있는 셀을 알 수는 없습니다.

필자는 파일을 스캔하고 각 행의 첫 번째 바이트 인덱스에 대한 찾아보기 테이블을 만드는 것을 고려했습니다. 이렇게하면 행렬 [12345,20000]에 액세스하려면 12345 행의 시작 부분을 찾은 다음 줄을 가로 질러 스캔하여 올바른 셀에 도달 할 때까지 쉼표를 계산합니다.

저는 이것을 시도하려고합니다. 그러나 다른 누구에게도 더 좋은 아이디어가 있습니까? 나는 이런 파일을 다루는 첫 번째 사람이 아닐 것이라고 확신합니다.

건배

편집 : 파일이 매우 희소 행렬이 포함되어 있음을 알아 두셔야합니다. CSV 파일의 구문 분석이 너무 느려지는 경우 파일을보다 적절하고 처리하기 쉬운 파일 형식으로 변환하는 것이 좋습니다. 스파 스 매트릭스를 저장하는 가장 좋은 방법은 무엇입니까?

답변

3

상당히 큰 CSV 파일에 Lumenworks CSV 판독기를 사용 했으므로 파일을 얼마나 빨리 구문 분석 할 수 있는지 빨리 볼 가치가 있습니다.

Lumenworks CSV

+1

이 방법으로 RAM을 검색하고로드하는 것을 방지 할 수있는 방법이 없습니다. 그것은 순차적 인 리더 일뿐입니다. –

1

색인 파일은 당신이 할 수있는 가장 좋은 것입니다. 나는 내기했다. 행의 크기를 알 수 없으므로 파일을 스캔하거나 색인을 갖는 것 이외의 다른 행으로 직접 건너 뛸 수 없습니다.

유일한 질문은 색인의 크기입니다. 크기가 너무 크면 매 5 번째 줄 (예 :)을 인덱싱하고 5 줄의 범위에서 스캔하여 크기를 줄일 수 있습니다.

3

우선 무엇을 특정 행을 참조하고 싶습니까? 행의 색인 이니, 당신이 관심있는 행을 아는 데 도움이 될 다른 테이블이나 다른 것을 가지고 있습니까? 아니면 이드 같은 것이지?

이 아이디어는

  • 당신의 접근 방식
  • 이진 검색을 마음에 온다. 평균 길이 (크기/행)가 있다고 가정하면 순서가 지정된 행에 식별자가 있다고 가정하고 2 분 검색을 사용하여 행을 찾거나 적중했는지 여부를 알 수 있습니다.
  • 데이터베이스에로드 중! 그건 그렇고, 당신이 그렇게하지 못하게하는 이유는 무엇입니까? 무료 인 SQL 익스프레스를 사용하고 크기 제한을 피하기 위해 샤드 데이터를 여러 데이터베이스에 저장할 수도 있습니다.
+0

* 데이터베이스에로드 중 * ... 인덱스를 만드는 방법은 다음과 같습니다. –

+0

저는 이진 검색에 대한 아이디어를 좋아합니다. 그러나 당신이 말했듯이, 그는 csv의 각 행에 rowid를 가져야 할 것입니다. –

+0

이상하게도 SQL 데이터베이스의 데이터에서 매트릭스가 생성되었습니다. 나는 발전기를 만들지 않았고 이제 출력을 다루어야한다. 나는 더 구조화 된 데이터 유형으로 데이터를 다시 고려하고있다. MSSQL 또는 이진 파일을 사용해야합니까? – user593062

0

특히 64 비트 OS를 사용하는 경우 파일을 RAM에로드하면 안된다는 것에 동의하지 않습니다.

크기가 12345x20000 인 행렬을 할당하는 데 문제가 없어야합니다. 이는 약 1에 불과합니다.9GB (배정 밀도). 사실 크기가 더 크더라도 64 비트 플랫폼에서이 방법을 권장합니다 ("가상 메모리"참조).

두 번째로 매트릭스가 희박하다고 말했기 때문에 RAM에로드 할 수 있지만 일부 메모리를 절약하기 위해 스파 스 표현을 사용할 수 있습니다.

결론적으로 응용 프로그램이 매트릭스에 많은 액세스를 필요로하고 성능이 다소 중요하면 RAM에 두는 것이 내가 가장 좋아하는 접근 방법입니다.

+0

물론, 당신은 그 처리를하고 결과를 RAM이 아닌 파일에 넣을 수 있습니다, 당신은 여전히 ​​일정한 시간 탐색을 얻지 만 더 느릴 것입니다 – Greg

0

필드가 고정 폭이되도록 파일을 사전 처리하십시오. 그렇다면 임의의 읽기를 쉽게 할 수 있습니다.

이전과 비슷한 종류의 작업을 수행하면 로컬 디스크에서 10G 가변 폭 파일을 읽고 10G 고정 폭 파일을 로컬 디스크에 몇 개 (~ 20)로 기록하는 간단한 코드를 작성할 수 있습니다. 의사록. 최대 투자가 이루어지면 무작위로 읽어야 할 횟수와 읽어야 할 파일의 빈도가 달라집니다.

0

지연 성 인스턴스화로 읽을 수있는 별도의 파일을 12345 개 작성한 경우 어떻게됩니까? 각 파일은 데이터가 필요한 경우에만 읽을 수 있습니다. 데이터가 완전히 희박한 경우 IsEmpty bool 속성을 사용하여 데이터 구조를 만들 수 있습니다.

동일한 요소를 계속해서 액세스해야합니까? 아니면 각 요소를 한 번 읽어야합니까?

관련 문제