2012-03-20 2 views
1

타임 스탬프 필드를 기반으로 데이터를 샘플링하고 싶습니다. 나는 엄청난 양의 데이터 파일을 읽으며, 하루에 백만 건이 넘는 레코드를 가지고있다. 매월 여러 파일이 있습니다.필드를 기반으로 한 데이터 샘플링

는 지금은이 데이터를 읽을 수 있지만, 상점, 5 % 또는 10 % MySQL 데이터베이스로, 말한다. 각 데이터 파일의 레코드 수에 대한 사전 지식이 없습니다.

내가 파일에 대한 전체 읽기 데이터의 5 %를 샘플링 할 수있는 방법이 있습니까? 이런 종류의 문제에 대한 표준 통계적 접근법이 있습니까? 아래의 의견에 따라

편집 :이 샘플링 생각하기 전에

는, 나는 두 필드의 키 기반의 파티션과 인덱스를 생성했다 : ID와 날짜를. id 필드는 clientId와 더 비슷합니다. 파티셔닝을하더라도 1 천 5 백만 행의 2 개 필드로 이루어진 그룹은 30-60 분의 범위에서 범죄 시간이 길어질 수 있습니다. 또한 필드별로 그룹 중 하나에 추가 색인을 만들었습니다.

이 보여줄 것입니다 나의 설명 :

SIMPLE 방문 어디에 사용 3ColumnerIndex, 2ColumnIndex 2ColumnIndex (302) const를 7493642을 심판을; filesort 사용

innodb에 4GB의 버퍼 크기를 부여한 후에이 성능을 얻었습니다!

+0

파일에서 각 레코드는 어떤 방식 으로든 포함되어 있습니까? –

+0

예, 각 레코드는 한 줄입니다. 그리고 난 내 자바 코드에서 해당 파일을 읽고 문제가되지 않습니다 청소, 파싱 등을 할, 나는 그것 모두를 읽을 수있는 모든 데이터베이스에 쓸 수 있지만, 모든 개월 동안 데이터를 쓰는 날 가까이 가져옵니다 1 천 5 백만에서 2 천만 건까지 –

+0

그래서 파일을 읽은 후에 읽은 레코드의 수를 알고 있습니까? –

답변

1

당신은이 작업을 수행하려면 레코드 수의 추정이 필요 당신은

SELECT name, email FROM users WHERE name LIKE 'a%' LIMIT 10; 

같은 제한을 사용할 수 있지만, 나는 또한 도움이 될이 링크를 발견 하지만 당신은 당신이이 문제가되지 않습니다 필요가 얼마나 많은 샘플의 엄격한 요구 사항이없는 경우 :

  1. k 샘플을 n 레코드 중에서 선택한다고 가정합니다. 당신이 충분한 기록이 될 때까지 각 레코드에 대해
  2. 하거나 : 미만 k/n, 출력 현재 레코드의 경우
    1. 는 0과 1
    2. 사이의 임의의 숫자를 생성합니다. k := k-1n := n-1을 입력하십시오. 그렇지
    3. , 기록을 폐기하고 n := n-1을 넣어.

각 레코드 은 확률 k/n를 가진 출력에 나타난다. 예 : 두 번째 레코드가 나타날 확률은 다음과 같습니다.

(k/n)*(k-1)/(n-1) + ((n-k)/n)*k/(n-1) = (k-1+n-k)*k/(n*(n-1)) = k/n 
+0

답해 주셔서 감사합니다. 나는이 woild가 어떻게 작동하는지 보았다. 나는 미리 n이 없다. –

+0

n 및 k를 입력 파일의 크기의 일부로 "추정"할 수 있습니다. 잘못하면 다른 레코드보다 일부 레코드가 선택 될 가능성이 적어 지거나 출력 결과가 k 레코드보다 적습니다. 5-10 %의 샘플을 무작위로 추출해야한다는 귀하의 요구 사항에 따라 이것은 정상적입니다. – Joni

+0

당신이 할 수있는 또 다른 일은 생성 된 난수를 일정한 백분율과 비교하는 것입니다. 그러나 출력 레코드의 수가 임의적입니다. 또는이 알고리즘을 사용하여 10000의 각 블록에서 500 개의 레코드를 선택할 수 있지만 일부 조합의 경우 다른 것보다 가능성이 높기 때문에 출력에 편차가 있습니다. – Joni

관련 문제