2009-04-07 4 views
3

마무리 작업을 완료하는 데 수개월이 걸릴 수있는 루비 프로세스를 실행할 계획입니다. 가능하다면 정전이나 잘못된 버튼을 눌러 한 달 내내 비용이 들지 않도록하고 싶습니다.장시간 실행되는 루비 프로세스를 쉽게 백업합니다.

프로그램 상태를 디스크에 주기적으로 저장하는 쉬운 방법이 있습니까? (더 많은 노력이 필요한 기술은 데이터베이스와 다른 모든 것을 관리하는 코드를 추가하거나 프로세스 운영 체제의 가상 컴퓨터를 사용하는 코드를 추가하는 것을 포함합니다.) 관심있는 사람들을 위해 프로세스에 멀티 기가비트 XML 파일을 구문 분석하는 과정이 포함됩니다. 잘 알려진 웹 사이트의 일부 정보를 처리, 그리고 그것을 함께가는 같은 액티브 데이터베이스에 정보를 저장하는 회)

편집 :..이 프로젝트는 this one이며, XML 파일 페이지-articles.xml입니다 (예 : enwiki-20090306-pages-articles.xml). 독점적 인 것은 아니며 "Plz Halp"모드에 있기를 원하지 않았습니다. 첫 번째 패스는 Wikipedia 페이지 제목 목록을 가져오고, 다음 패스는 각 페이지에서 다른 페이지로의 첫 번째 링크를 결정한 다음 몇 가지 통계를 계산합니다.

일부 응답자의 제안에 따라 중단 된 부분부터 계속해서 유효한 옵션 일 수 있습니다. 첫 번째 단계에서 충돌이 발생하면 이미 실행 된 항목을 추가하지 말고 다시 실행할 수 있습니다. 두 번째 단계에서 충돌이 발생하면 링크를 계산하지 않은 페이지에 대한 링크를 작성하도록 요청해야합니다. 통계 계산 중 충돌이 발생하면 통계를 다시 계산할 수 있습니다.

다른 편집 :이 질문의 일반적인 버전은 Save a process’ memory for later use?입니다. 장시간 실행되는 프로세스를 쉽게 백업 할 수없는 것 같습니다.

+0

xml은 무료로 제공됩니까? 아니면 간단한 샘플을 게시 할 수 있습니까? 너무 독점적이지 않은 경우 어떤 종류의 모델 구조를로드하려고합니까? –

답변

1

나는 이것을 쉽게 할 수있는 방법이 없다고 생각하지만, 코드를 약간 수정하려고한다면, YAML (사용하기 쉬운 마크 업 라이브러리 . yaml.org). YAML 라이브러리를 가져 오면 모든 객체에 .to_yml 함수가 주어 지므로 전체 객체를 직렬화하므로 파일에 저장할 수 있고 yml에서도 객체를 복원 할 수 있습니다. 그래서 주기적으로 저장하려면 약간의 코드를 추가해야하지만 실제 저장 비트는 상대적으로 쉽습니다. 또한 yaml은 내장되어 있으므로 다운로드가 필요 없습니다.

 
require "yaml" 
def backup(objects_im_Using) 
    out_file = File.open("prefix"+Time.now.strftime('%Y-%M-%d')+".yml","w") 
    objects_im_Using.each {|object| out_file

(I 백업 기능 블록을 생성 또는 somesuch해야하는 것이 작업을 수행하는 실제 루비 방법을 생각하지만.) 내가 생각할 수있는

죄송합니다, 더 좋은 방법입니다. 이 질문에 대한 더 나은 응답을 읽는 데 관심이 있습니다!

+0

실제로 Yaml은 마크 업 언어가 아닙니다. – Chuck

+0

YAML은 위키 백과에 따르면 "Yet Another Markup Language"라고도합니다. –

+0

잘, 어느 쪽이든, 확실히 '아직 또 다른 마크 업 라이브러리'가 아닙니다. 내가 그것을 썼을 때 나는 무엇을 생각하고 있었는지 모른다. 흠. – YenTheFirst

1

내 작업 기계가 예기치 않게 지난 주말에 전원을 껐다는 견해에서 (건축물의 다른 곳에있는 건축물) 저는 그 생각에 동조합니다.

작업을 분할하는 데 유용한 값이 있습니까? 입력 파일을 여러 작은 파일로 다시 작성할 수 있습니까?

주문량이 적으므로 매일 아침 AR 모델을 통해 약 2 백만 행을로드하는 프로세스가 있습니다. 필자가 (다른 나라의 DB 서버 - 물어 보지 마라) 필자가 겪고있는 지루한 데이터베이스 대기 시간 문제를 해결하기 위해 필자는 입력 된 CSV 파일을 각각 16 개의 "조각"으로 다시 작성합니다. 각 프래그먼트는 프래그먼트 모델에 기록되어 재실행 실패를 식별하는 데 도움이됩니다. 그것은 놀랍게도 잘 작동하고 필요한 경우 재시동이 간단합니다. 일반적인 실행 시간은 약 30 분.

XML 입력이 합리적으로 잘 구조화되어 있다면, 하위 구조 (그보다 나은 용어가있을 것입니다)를 별도의 파일로 추출하는 것이 매우 간단해야합니다. 나는 SAX 파서가 얼마나 빨리이 일을 할 수 있을지 모르겠다. 아마도 너무 끔찍한 일은 아니지만 XML 라이브러리가 없어도 그렇게 느리다면 그렇게 할 수있다. 대상 모델에 열을 추가하여로드 된 부분을 식별하십시오. 이렇게하면 불완전한 실행을 제거하는 것이 간단합니다.

그 외에도 모든 클래스를 하나의 클래스로 유지하고 마샬링을 사용하여 주기적으로 저장하는 것이 좋습니다.

+0

약 500 만 개에 불과합니다. (컴퓨터를 사용하려고하는 컴퓨터는 5 ~ 10 년 된 PC로 색인 생성을 제외하고는 DB 최적화가 이루어지지 않을 수 있습니다. 파티셔닝은 어느 정도까지 도움이되지만 (첫 번째 단계) 각 객체는 문자열 X가 다른 객체의 제목인지 여부를 알아야합니다 (두 번째 패스). –

1

데이터베이스가 저장 될 때마다 데이터베이스에 저장되지만 질문에 따라 해당 데이터 만 사용하여 중단 한 부분을 선택할 수없는 것으로 보입니다.

임시 테이블이나 임시 열에 유지할 수있는 데이터가 메모리에 저장되어 있으므로 어디에서 끝낼 수 있습니까? 어쩌면 전체 상태가 필요하지 않을 수도 있습니다. 데이터의 일부분만으로도 전원이 꺼지는 지점을 다시 만들 수 있습니다.

0

확인. 우리가 조금 더 알게되었으므로, 나는 전체적인 질문이 논쟁의 여지가 있다고 생각합니다. 나는 좋은 금요일을 속삭이고 다니면서 몇 시간 만에 필요한 데이터를 추출 할 수 있어야한다고 생각합니다.

자신을 설정하고, 저장해야하는 항목, 저장하는 법 및 갖고있을 때해야 할 일을 정확히 이해하려면 며칠이 걸릴 것입니다.하지만 재미는 있습니다. 어쨌든 부분.

다음은 내가 문제에 접근 할 수 있다고 생각하는 방식입니다.

당신은 파일 구조를 알고 있습니다. 그것은 대단히 큰 것입니다. (솔직히 말하자면, 정직합니다) XML 파일입니다. 나는 대략 21GB를 본다. 구조적으로 꽤 간단합니다. <page> 요소가 필요합니다. 여기에는 제목, 텍스트 (또는 적어도 그 안에있는 링크) 및 아마도 id와 같은 몇 가지 기본 정보를 추출해야합니다. 그것은 매우 간단한 파싱 작업입니다 - XML ​​라이브러리 나 그 밖의 것들이 필요하지 않습니다. 간단한 문자열 매칭 알고리즘으로 충분합니다. 제목의 경우 String # index를 사용하여 열기 및 닫기 태그를 찾고 그 사이의 비트를 추출합니다. 텍스트의 첫 번째 링크는 규칙에 따라 첫 번째 실제 링크를 결정해야하기 때문에 조금 까다 롭습니다.

메모리로 21GB의 텍스트를 읽는 것은 좋은 트릭이 될 것이지만 물론 그렇게 할 필요는 없습니다. 작업에 유용한 크기의 청크가 필요합니다. 메가 바이트는 합리적인 것처럼 보일 것입니다. 또는 10K 일 수도 있습니다. 큰 문제는 아닙니다. 실험 할 GB 정도를 잘라냅니다.

분당 250,000 개의 제목/첫 번째 링크 쌍을 텍스트 파일로 추출하여 쓰는 스크립트가 있습니다. 그것은 "리다이렉트"페이지를 무시하고 (더 많은 페이지를 처리하고있다) ":"(충분히 똑똑하지는 않지만, 거기에 약간의 처리를 넣고 싶었다)의 링크를 무시한다. regexen, 도대체, 아니 필요합니다. 약 30 줄의 매우 간결한 코드. 약 523 만 타이틀 (필자는 파일, 프로젝트 등)이 필요하지 않은 것으로 생각하며 약 20 분 만에보다 집중적이고 관리가 용이 ​​한 1.03GB 출력물 (아래 참조)을 작성했습니다. 루비 (MRI) 1.8.6, 윈도우 비스타, 2GHz 코어 2 듀오. 그리고 루비의 속도가 느린다고합니다.

처음 3 개 라인 :

Anarchism, [[political philosophy]] 
Autism, [[Neurodevelopmental disorder|brain development disorder]] 
Albedo, [[Sun]] 
관련 문제