2012-09-10 2 views
2

나는 compute.ml이라는 OCaml 소스 코드에 포함시키고 자하는 대용량 데이터베이스 (약 150 000 레코드)를 가지고있다. 나는 (성공없이)이 테이블을 해시 테이블로 변환하고이 하 스텔 블을 compute 함수에 임베드하여 외부 SQL 데이터베이스에 쿼리를 수행하지 않고 quicly로 실행되도록했다.mysql의 ocaml 해시

나는이 개 질문이 :

  • 는 (내 OCaml의 기능 compute를 액세스 (또는에 포함) 할 수있는 연관 배열 (Hashtbl)에 한 번 MySQL의 테이블 자체를 내보낼 수있는 방법이 있나요 바이너리로 컴파일 및 사용)?
  • 이 해시 테이블은 함수에 영구적으로로드되었거나 함수가 바이너리 내에서 호출 될 때마다 다시 시작되어야합니까?

내가, CSV 형식으로 내보내, 142,741 기록과 MySQL의 테이블이는 다음과 같습니다

"1";"27";"10";"coco";"0";"730";"1641025";"1641053";"foo";"1";"S";"0" 
"2";"27";"11";"kiki";"0";"730";"1641054";"1641083";"bar";"1";"S";"0" 
"3";"27";"12";"toto";"0";"730";"1641084";"1641113";"foofoo";"1";"S";"0" 
"4";"27";"1";"tata";"0";"730";"1641114";"1641142";"barbar";"1";"S";"0" 
... 
"142741";"5";"7";"chotto";"0";"1347";"1971472";"1971500";"lastrecord";"1";"S";"0" 

답변

2

내가 CSV 형식으로 수출하여 MySQL의 테이블을 포함하는 .csv 파일 data.csv있을 것입니다. 프로그램이 실행될 때 그런 다음 OCaml의에서, 나는 한 번,이 파일을 읽고 구문 분석 :

let data = read_csv("data.csv") 

data는 입력 Hashtbl.t의, 따라서 변수입니다 당신의 150K 기록을 포함. 당신이 프로그램을 시작할 때

let compute x = 
    let foo = Hashtbl.find data x in 
    ... 

이 방법을, MySQL 서버에 아무 전화도 없다, 데이터를 한 번만 읽어 : 그런 다음, (귀하의 질문에 compute라고합니다)를 OCaml의 기능이 변수를 사용하여 compute 함수를 호출 할 때마다 이미 메모리 변수 인 data이 사용됩니다.

csv 파일을 읽고 구문 분석하는 데 신경 쓰면 Marshal 모듈을보고 data 변수의 이진 버전을 저장할 수 있습니다.

read_csv은 표준 라이브러리에 없지만, 예를 들어 http://csv.forge.ocamlcore.org/입니다.

+0

내 요구 사항에 정확하게 응답하는 정확한 대답 인 jrouquie에게 감사드립니다. 나는 그것을 시도하고 있지만 불행히도 내가 명령을 사용하여 만들 수 없습니다 read_csv (mmsg : "오류 : 언 바운드 값 read_csv"). CSV-1.2.3 라이브러리를 ~/opt/cvs-1.2.3에있는 csv-1.2.3.tar.gz 파일에서 골라서 설치했습니다 ... mybe 제가 잘못 했어요. – user1659958

+0

사실 'ocamlfind list -describe'는 나에게 "csv"라는 라이브러리 목록을 제공하지만 "OCaml 배포판"이 아닌 사람들은 액세스 할 수 없습니다. 나는 그들을 깔끔하게 설치하는 방법을 모른다. 어떤 생각? – user1659958

+0

사용하려는 기능은 아마도'Csv.load :? separator : char -> string -> t'이지만, 자세한 내용은 문서를 참조하십시오. 이 라이브러리를 설치하는 데 문제가 있으면 다른 질문을해야합니다. – jrouquie