Make로 데이터 작업 자동화

6498 단어 make
저는 40세 이상으로 생산성을 유지할 수 있다고 생각하고 싶습니다. Make은 올해 43세이며 여전히 데이터 정리 또는 데이터 분석을 자동화하기 위해 선택한 도구입니다. 다재다능하고 아름답게 단순합니다. (처음에는.) 그러나 in a recent survey 데이터에 정통한 경제학자의 5% 미만이 Make를 정기적으로 사용한다는 사실을 발견했습니다.

만들기란 무엇입니까?



대부분의 빌드 시스템은 무언가를 빌드하기 위한 것입니다. Java, C 등으로 코드를 컴파일합니다. Make도 그렇게 해야 하며 대부분의 자습서와 StackOverflow 질문에는 C 코드를 빌드하는 방법에 대한 예제가 포함되어 있습니다.

그러나 기본적으로 Make는 매우 간단합니다. 다음 내용으로 내 폴더에 Makefile라는 텍스트 파일을 만듭니다.

clean_data.csv: raw_data.csv data_cleaner.py
    python data_cleaner.py

그런 다음 쉘에서 make라고 말하고 Make는 clean_data.csv에서 raw_data.csv를 생성합니다.

즉, 지정해야 합니다.

target: source
    recipe

Make가 레시피를 실행합니다.

이 정보는 어쨌든 내 문서에 대해 기록하고 싶은 것입니다. 내 스크립트에는 무엇이 필요하며 무엇을 생성합니까? Makefile에 넣을 수도 있습니다.

이렇게 하면 일련의 데이터 작업을 연결할 수 있습니다.

visualization.pdf: clean_data.csv visualize.py
    python visualize.py
clean_data.csv: raw_data.csv data_cleaner.py
    python data_cleaner.py

쉘에 make를 입력하면 원시 데이터에서 바로 다시 생성된 내 visualization.pdf를 얻습니다.

Order matters here. Typing make without any arguments recreates the first target found in the file called Makefile. I can also type make clean_data.csv if I want to recreate a specific target.


필요한 작업만 수행



내 그래프의 색상이 마음에 들지 않아 편집하기로 결정했다고 가정합니다visualize.py. 그러나 데이터 정리에는 많은 시간이 걸립니다! clean_data.csv가 이미 최신 상태인 경우(raw_data.csvdata_cleaner.py의 타임스탬프 기준) Make는 해당 단계를 건너뛰고 시각화 레시피만 다시 실행합니다.

모든 것을 다시 실행할 필요는 없습니다. 게으른 것이 좋습니다. 당신이 글을 쓰고 싶은 또 하나의 이유.

변수 및 함수



처음 몇 개의 간단한 Makefile의 힘을 느끼자마자 더 많은 것을 갈망하게 될 것입니다. 할 수 있습니까? 할 수 있습니까? 대답은 '예'입니다. 할 수 있지만 StackOverflow에서 많은 검색이 필요합니다.

내가 정기적으로 사용하는 기능 중 하나는 자동 변수입니다. 깔끔한 Python 스크립트에 파일 이름을 하드 코딩하고 싶지 않은 경우(이유는 곧 알 수 있음) 대상 및 소스 이름을 변수로 전달할 수 있습니다.

clean_data.csv: raw_data.csv data_cleaner.py
    python data_cleaner.py < $< > $@

이것은 raw_data.csv(변수$<는 첫 번째 소스 파일을 참조함)를 data_cleaner.py의 STDIN에 전달하고 STDOUT의 출력을 clean_data.csv에 저장합니다(변수$@는 대상을 나타냄).

왜 이러한 기호입니까? 저에게 묻지 마세요. 그들은 예쁘지 않지만 일을 끝냅니다.

다음과 같은 functions도 사용할 수 있습니다.

clean_data.csv: input/complicated-path/raw_data.csv data_cleaner.py
    python data_cleaner.py $(basename $(notdir $@)) 

그리고 더 많은.

병렬 실행



그리고 이제 가장 중요한 부분입니다. Make는 내 작업을 병렬로 실행할 수 있습니다. 잘 갖춰진 AWS 서버에서 기꺼이 시작make -j60하여 60개의 스레드에서 작업을 수행합니다. Make는 작업 스케줄러 역할을 합니다. 무엇이 무엇에 의존하는지 알고 있기 때문에 경합 상태에 빠지지 않을 것입니다.

  • Knock, knock.
  • Race condition.
  • Who's there?


위와 같이 레시피의 선형 체인이 있는 경우 병렬 실행은 도움이 되지 않습니다. 하지만 종속성 그래프를 병렬 분기로 분할할 수 있으면 올바른 순서로 실행됩니다.

따라서 내 데이터가 둘(또는 그 이상)로 분할된다고 가정합니다. 다음 코드는 데이터 정리 레시피의 병렬 실행을 허용합니다.

visualization.pdf: merged_data.csv visualize.py
    python visualize.py
merged_data.csv: clean_data_1.csv clean_data_2.csv merge_data.py
    python merge_data.py
clean_data_%.csv: raw_data_%.csv data_cleaner.py
    python data_cleaner.py < $< > $@

패턴 매칭 문자 %를 사용하여 clean_data_1.csvclean_data_2.csv를 모두 매칭했습니다.
j , make -j2 옵션을 사용하여 make를 호출하면 데이터를 정리하는 두 개의 프로세스가 시작됩니다. 둘 다 완료되면 병합 데이터 레시피가 실행된 다음 시각화가 실행됩니다. (단일 스레드가 됩니다.)

저는 정기적으로 병렬 실행을 사용하여 Monte Carlo 시뮬레이션을 수행하거나 부트스트랩 샘플을 그립니다. 병렬 작업이 500개이고 프로세서가 40개뿐인 경우에도 make -j40는 이러한 작업을 참을성 있게 처리할 것입니다. 그리고 다른 사람이 주말 동안 Matlab을 실행하게 하기 위해 내 작업을 중단하면(그들이 왜 그럴까요?) 월요일에 작업을 460개만 남기고 다시 시작할 수 있습니다.

  • Simple real-world Makefile 변수 및 for 루프 포함.

  • Not-so simple Makefile 변수, for 루프, 함수 및 패턴 일치 포함.

  • 아직도 Make가 싫으신 분들은? $< $@ 그들.

    원래 게시됨


    좋은 웹페이지 즐겨찾기