프로그래밍에서 DAG (Directed Acyclic Graph)를 언제 사용해야합니까?


37

최근에 ecto 라는 프레임 워크를 찾았습니다 .

이 프레임 워크 에서 ecto Directed Acyclic Graph 인 "plasm " 이라는 기본 구성 요소 ecto에서는 ecto 스케줄러를 통해 플라스마를 작동 할 수 있습니다.

이 메커니즘의 이점이 무엇인지 궁금하고 다른 상황에서 DAG의 개념을 활용할 수 있습니까?


6
대부분의 소스 제어 관리 시스템은 개정을 DAG로 구현합니다.
Oded

1
계획 은 DAG 를 많이 다루는 문제의 전체 지점입니다 .
TC1

1
나무로 표현되는 많은 것들이 아직까지도 여전히 일반적인 에지 사례를 명심할 때 실제로 DAG로 표현 되어야합니다 .
Joachim Sauer

@JoachimSauer 예 : 하드 링크가있는 파일 시스템
jk.

답변:


29

좋은 질문.

  • 코드는 코드 내에서 수행 된 각각의 산술 연산의 입력 및 출력을 설명하는 DAG로 표현 될 수있다. 이 표현을 통해 컴파일러는 공통 하위 표현식 제거를 효율적으로 수행 할 수 있습니다.
  • 대부분의 소스 제어 관리 시스템은 개정을 DAG로 구현합니다.
  • 여러 프로그래밍 언어는 유 방향 비순환 그래프로 서로 관련된 값 시스템을 설명합니다. 하나의 값이 변경되면 후속 항목이 다시 계산됩니다. 각 값은 DAG에서 선행 작업의 기능으로 평가됩니다.
  • DAG는 프로세스 및 리소스 집합 간의 종속성을 보여주기 때문에 교착 상태를 감지하는 데 유용합니다.
  • 계산 기하학의 많은 무작위 알고리즘에서, 알고리즘은 나중에 더 미세한 특징으로 대체 된 일부 기하학적 구조의 특징을 나타내는 이력 DAG를 유지한다; 위의 두 데이터 구조에 대해이 DAG의 경로를 따라 점 위치 쿼리에 응답 할 수 있습니다.
  • 메모리에 DAG가 있으면 전체 세트의 최대 실행 시간을 계산하는 알고리즘을 작성할 수 있습니다.
  • 스프레드 시트 시스템을 프로그래밍하는 동안 첫 번째 셀이 두 번째 셀의 값을 사용하는 수식을 저장하는 경우 한 셀을 다른 셀에 연결하는 종속성 그래프는 방향이 지정된 비순환 그래프 여야합니다. 종속주기는주기에 포함 된 셀이 잘 정의 된 값을 갖지 않기 때문에 허용되지 않습니다. 또한 종속성을 비순환으로 설정하면 스프레드 시트가 변경 될 때 토폴로지 순서를 사용하여 셀 값의 재 계산을 예약 할 수 있습니다.
  • DAG를 사용하여 올바른 순서로 계산을 평가하는 알고리즘을 작성할 수 있습니다.

편집하다 :

  • 스프레드 시트에서 수식 값을 다시 계산할 때 수식 셀 평가 순서는 DAG를 사용하여 수행 할 수 있습니다.
  • Git은 컨텐츠 저장, 헤드에 대한 참조 포인터, 객체 모델 표현 및 원격 프로토콜에 DAG를 사용합니다.
  • DAG는 추적 예약에 사용됩니다. 전역 예약에 대한 첫 번째 실용적인 접근 방식 인 추적 예약은 가장 자주 실행되는 제어 흐름 경로를 최적화하려고합니다.
  • Ecto는 처리 프레임 워크이며 DAG를 사용하여 처리 그래프를 모델링하여 그래프가 동기식 실행 순서를 갖도록합니다. Ecto의 Plasm은 DAG이며 Scheduler가이를 수행합니다.
  • DAG는 하드웨어 파이프 라이닝과 유사한 방식으로 루프를 최적화하는 데 사용되는 기술인 소프트웨어 파이프 라이닝에 사용됩니다.

좋은 자료 :


1
루프가 없습니까? 루프가 종료되는 한 자격이 있어야한다고 생각합니다. A-> B-> C 대신 A-> B-> A1-> B1-> A2-> B2-> C가 될 수 있습니다. 원보다 나선형처럼.
GlenPeterson

@GlenPeterson, 그렇습니다. 내 답변을 편집했습니다. 의견 주셔서 감사합니다. :)
Md Mahbubur Rahman

여전히 "직선"이 필요하다고 생각하지 마십시오. DAG에서 'G'는 그래프를 나타냅니다. 아래에서 내 답변을 확인하십시오. 대답하기 전에 충분히주의 깊게 읽지 못했지만 완전성과 전반적으로 깨달음에 대한 답을 +1했습니다.
GlenPeterson

@GlenPeterson, 실수로 죄송합니다. 내 답변을 업데이트했습니다. 나는 또한 당신의 대답을 좋아합니다. 답에 +1했습니다.
Md Mahbubur Rahman

3
+1 주셔서 감사합니다. 나는 여전히 모든 코드가 산술 표현에 국한되지 않고 DAG라고 생각합니다. I / O, 예외, 다중 프로세스 상호 작용 및 하드웨어 인터럽트는 모두 Directed (시작 또는 종료 때문에)의 다른 시작 또는 끝 노드, 비순환 (무한 루프 없음) 그래프 (정렬 된 순서의 노드 쌍 세트) . Ricky의 질문에 대한 흥미로운 후속 조치는 "DAG가 아닌 정확하고 작동하는 코드가 있습니까?"입니다. 나는 대답이 "아니오"라고 생각하지만 누군가 나를 잘못 증명하게 된 것을 기쁘게 생각합니다.
GlenPeterson

12

답은 프로그래밍과 관련이 거의 없다는 것입니다. 문제 해결과 관련이 있습니다.

연결된 목록이 특정 클래스의 문제에 사용되는 데이터 구조 인 것처럼 그래프는 특정 관계를 나타내는 데 유용합니다. 연결된 목록, 트리, 그래프 및 기타 추상 구조는 코드로 구현할 수 있다는 점에서 프로그래밍과 연결되어 있습니다. 그것들은 더 높은 추상화 수준으로 존재합니다. 프로그래밍이 아니라 문제 해결에 데이터 구조를 적용하는 것입니다.

그래도 프로그래밍과의 관계를 원한다면 다음 사항을 고려하십시오.

  • DAG ( 그래프 대기 그래프 -자세한 기술 정보 )는 프로세스 및 리소스 집합 (DAG의 노드) 간의 종속성을 보여 주므로 교착 상태를 감지하는 데 유용합니다. 주기가 감지되면 교착 상태가 발생합니다.
  • 메모리에 DAG가 있으면 다음에 대한 알고리즘을 작성할 수 있습니다.
    • 계산이 올바른 순서로 평가되는지 확인하십시오 ( 토폴로지 정렬 )
    • 계산을 병렬로 수행 할 수 있지만 각 계산에 최대 실행 시간이있는 경우 전체 세트의 최대 실행 시간을 계산할 수 있습니다

1
이것이 프로그래밍 범위를 넘어서는 방법을 다시 보여주기 위해 관계형 데이터베이스의 테이블을 화이트 보드로 작성하여 한 테이블에서 다른 테이블로의 경로 길이를 정신적으로 구문 분석하는 방법에 대해 생각하십시오. 이는 DAG를 사용하여 성능을 결정하는 것과 같습니다 데이터 모델
Jimmy Hoffa

6

다른 사람들은 DAG를 데이터에 적용했지만 적어도 코드에 적용 가능하다고 생각합니다. Mahbubur R Aaman은 이것을 언급하므로 실제로 이것은 완전한 답변보다 그의 답변에 대한 부록입니다.

무한 루프가없는 명령형 컴퓨터 프로그램 (@AndresF 덕분에)은 DAG (Directed Acyclic Graph)입니다. 코드의 가능한 실행 경로가 지시되고 (먼저, 그 다음에), 비순환 (무한 루프를 형성하지 않음)을 의미합니다. 중요한 코드를 통과하는 경로가 목록이나 트리만큼 단순하지 않기 때문에 그래프입니다.

XSLT에서 4 년 정도 일했습니다. 왜 이것이 범용 프로그래밍 언어가 아닌지 설명하려고 끔찍한 시간을 보냈지 만 DAG가 그 이유입니다. 특히 XSLT는 데이터 중심 언어입니다. 함수를 프로그래밍 (함수 프로그래밍 방식으로) 정의하지만 코드에서 이러한 함수를 호출 할 필요는 없습니다. 오히려 XSLT는 입력 XML 문서의 노드를 선택하고 반복하는 조합을 설정합니다. 이를 통해 입력 데이터의 구조에 따라 호출되는 함수와 순서가 결정됩니다.

이것은 오전 2시 30 분에 테스트하지 않은 데이터 조건이 발생하여 깨우고 수정해야 할 때까지 매우 흥미롭고 시원했습니다. 데이터가 DAG를 정의하게하면 DAG의 정의는 가능한 모든 입력 조건이됩니다. 사소한 비즈니스 응용 프로그램의 경우 계산할 수없는 수준입니다. 그들은 상상할 수 없다.

처음에는 함수형 프로그래밍이 DAG가 아닐 수도 있다고 생각했습니다. 실행 순서가 때로는 명확하지 않거나 프로그래머가 생각하기 때문입니다. 그러나 기능적 프로그램은 종속성을 정의합니다. 실제로 함수형 프로그래밍의 선언적 특성은 실행 순서를 지정하지 않고 종속성 (a ^ 2 = b ^ 2 + c ^ 2) 만 정의하는 것으로 생각할 수 있습니다 ( 'b'또는 'c'가 먼저 제곱인지 여부는 중요하지 않습니다) 을 더하기 전에 모두 제곱 된 한).

그러나 기능적 프로그래밍은 세부적인 수준에서 작업 순서에 대해 의도적으로 모호 할 수 있지만 종속성에 대해서는 절묘하게 명확합니다. 이것들은 동시성에 매우 적합한 기능입니다. 어쨌든 여전히 코드를 통한 경로 그래프가 있으며 그 그래프는 여전히 지시됩니다 (종속성은 종속 작업 전에 평가해야 함). 따라서 DAG도 적용됩니다.

좋은 질문입니다-게시 해 주셔서 감사합니다!


1
이 명령형 프로그램은 귀하의 의견으로는 DAG while (true) { print("hi"); }입니까? 종료하지 않는 프로그램을 제외하고 싶습니까?
Andres F.

5

현재 DAG는 프로그래밍에서 과소 평가되었습니다. 역사적으로 나무와 계층 구조로 개발과 관련된 많은 것들이 만들어졌습니다. 상자 안에서 무언가를 옮기는 것이 뇌가 복잡한 것을보다 쉽게 ​​관리 할 수있게하기 때문입니다. 그러나 이벤트와 이벤트가 다른 이벤트 및 상태에 의존하는 방식을 살펴보면 우리 삶과 프로그램의 어떤 것이 과거의 것이 아니라 미래의 것에 의존 할 수 있기 때문에 DAG를 얻게 될 것입니다. DAG 개념에 적용 할 수있는 관계. 개발에서 명시 적으로 사용되지는 않지만이를 염두에두면 더 잘 이해하는 데 도움이됩니다.


2

Ecto에서 Plasm의 장점이 무엇인지 궁금합니다.

DAG는 특정 작업이 다른 작업보다 먼저 수행되어야한다는 제약 조건으로 작업 모음을 순서대로 모델링하는 데 사용할 수 있습니다. Ecto 는 처리 프레임 워크이며 DAG를 사용하여 처리 그래프를 모델링하여 그래프가 동기식 실행 순서를 갖도록합니다. 원형질체외은 DAG에 있으며 스케줄러는 그것을 작동합니다.

다른 상황에서 DAG의 개념을 활용할 수 있습니까?

  • DAWG 는 일련의 문자열을 나타내는 데이터 구조이며 주어진 문자열이 길이에 비례하여 시간의 집합에 속하는지 여부를 테스트하는 쿼리 작업을 허용합니다.
  • Git 은 컨텐츠 저장, 헤드에 대한 참조 포인터, 객체 모델 표현 및 원격 프로토콜에 DAG를 사용합니다.

오랜 시간이 지났지 만 ...이 답변은 실제로 엑토의 정신을 이해하는 데 도움이된다고 생각합니다. 지적해야합니다. 감사!
포젠 라이

0

실제 예를 들어, 우리의 소프트웨어는 최종 사용자가 이미지에서 수행 할 일련의 작업을 정의 할 수있는 IDE와 유사합니다 (머신 비전 검사). 이러한 검사는 다른 검사에 의존하거나 검사에 의존 할 수 있습니다. 이것은 최종 사용자가 모두 구성 할 수 있기 때문에 디자인 타임에 병렬 처리를 최적화 할 수 없습니다. 이러한 검사 및 종속성을 DAG로 표시함으로써 런타임시 성능을 극대화하기 위해 전체 검사의 병렬 처리를 최적화 할 수 있습니다.


-1

또 다른 예를 들어, Cocoa 앱의 메모리 관리 규칙은 모든 강력한 참조가 방향성 비순환 그래프를 형성하여 누출이 없음을 보장합니다.


-2

makeDAG를 사용 하여 빌드에 대한 종속성을 찾는 것과 같은 시스템을 빌드하기위한 참조를 보지 않은 다른 답변을 추가하십시오 .

자세한 내용은 여기


내가 잘못 말한 이유는 무엇입니까? 왜 다운 다운되었는지
dlmeetei

당신은 다소 빈약 한 대답으로 다소 오래된 질문을 튕겼습니다. "다른 사람이 언급하지 않았기 때문에 이것을 추가하는 중 ..."이라는 답을 쓰고 싶은 유혹이 있고 한 문장 만 가지고 있다면 답이 좋지 않습니다. 질문 에 완전히 대답하고 응용 프로그램에서 DAG를 사용하는 방법,이 디자인이 작동하는 방식 및 다른 옵션보다 선택한 이유를 설명하십시오. 이상적으로는 여러 단락에 해당하는 내용입니다.

좋아, 나중에 자세히 설명하겠습니다
dlmeetei

Ok, 반복하는 대신, 다음과 같은 도구에서 사용되는 방법을 자세히 설명하는 링크로 업데이트되었습니다.make
dlmeetei

링크는 부실하거나 실패하는 불쾌한 습관이 있습니다. 이런 일이 발생하면 시작한 곳에서 바로 도움이 될 수있는 짧은 한 줄의 답변입니다. 이 답변이 독자적으로 설 수 있도록 링크의 내용을 요약 할 수 있습니까? (링크를 유지하고 링크가 없어도 답이 좋은지 확인하십시오).
Dan Pichelman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.