순수한 데이터 흐름 스타일로 "증분 업데이트"기능을 구성하는 패러다임이 있습니까?


10

나는이 질문을하는 데 올바른 용어를 알지 못하므로 대신 많은 단어로 설명 할 것입니다.

Background , 우리는 같은 페이지에 있습니다 : 프로그램에는 종종 캐시가 포함되어 있습니다-시간 / 메모리 균형. 일반적인 프로그래머의 실수는 업스트림 소스 / 전례 중 하나를 변경 한 후 캐시 된 값을 업데이트하는 것을 잊는 것입니다. 그러나 데이터 흐름 또는 FRP 프로그래밍 패러다임은 이러한 실수에 영향을받지 않습니다. 순수한 함수가 여러 개 있고 방향성 종속성 그래프로 함께 연결하면 노드는 함수의 입력이 변경 될 때까지 출력 값을 캐시하고 재사용 할 수 있습니다. 이 시스템 아키텍처는 데이터 흐름 기반 환경 에서 캐싱 (Caching in Dataflow-Based Environments) 문서에 설명되어 있으며 명령 언어는 메모와 거의 비슷합니다.

문제 : 함수의 입력 중 하나가 변경 될 때, 우리는 여전히 함수 전체를 실행하여 캐시 된 출력을 버리고 처음부터 다시 계산해야합니다. 많은 경우에, 이것은 나에게 낭비 인 것 같습니다. "상위 5 가지"목록을 생성하는 간단한 예를 고려하십시오. 입력 데이터는 정렬되지 않은 목록입니다. 정렬 된 목록을 출력하는 함수에 입력으로 전달됩니다. 이는 처음 5 개 항목 만 취하는 함수에 입력됩니다. 의사 코드에서 :

input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45]
intermediate = sort(input)
final_output = substring(intermediate, 0, 5)

정렬 함수의 복잡성은 O (N log N)입니다. 그러나이 흐름은 하나의 요소를 추가하여 입력이 한 번에 조금만 변경되는 애플리케이션에서 사용된다는 점을 고려하십시오. 매번 처음부터 다시 정렬하는 대신 실제로 O (N)는 새 요소를 올바른 위치에 삽입하여 이전 캐시 정렬 목록을 업데이트하는 함수를 사용하는 것이 더 빠릅니다. 이것은 하나의 예일뿐입니다. 많은 "처음부터"기능에는 "증분 업데이트"기능이 있습니다. 또한 새로 추가 된 요소는 5 번째 위치 이후로 final_output에도 나타나지 않을 수 있습니다.

내 직감은 이러한 "증분 업데이트"기능을 기존 "처음부터"기능과 나란히 데이터 흐름 시스템에 추가하는 것이 가능할 수 있다고 제안합니다. 물론 모든 것을 처음부터 다시 계산하면 항상 증분 업데이트를 수행하는 것과 동일한 결과를 제공해야합니다. 이 시스템은 그 특성이 있어야 경우 개별 원시 FromScratch - 증분 쌍마다 항상 같은 결과를 제공, 그들로부터 내장 된 큰 복합 기능도 자동으로 동일한 결과를 제공해야합니다.

질문 : FromScratch 기능과 그 증분 기능을 모두 지원하고 효율성을 위해 협력하며 큰 흐름으로 구성 할 수있는 시스템 / 아키텍처 / 패러다임 / 메타 알고리즘을 사용할 수 있습니까? 그렇지 않다면 왜? 누군가가이 패러다임을 이미 연구하고 출판했다면, 무엇이 무엇이며 어떻게 작동하는지에 대한 간단한 요약을 얻을 수 있습니까?


BTW는 예제의 특정 경우보다 효율적인 솔루션은 heap 을 사용하는 입니다. 항목을 삽입하는 것은 이제 이며 상위 값 의 업데이트 된 정렬 목록을 생성하는 것은 이제 입니다. O(logn)kO(klogn)
j_random_hacker

답변:


7

이 필드는 여러 번 발명되었으며 다음과 같은 많은 이름으로 사용됩니다.

(그리고 아마도 더.) 그것들은 같지 않지만 관련되어 있습니다.

Cai et al (1) : 온라인 알고리즘을 일반적으로 구현하는 두 가지 핵심 방법이 있습니다 (즉, 특정 알고리즘 문제를 언급하지 않음).

  • 정적 증분. 정적 접근 방식은 컴파일 타임에 프로그램을 분석하고 입력 변경에 따라 원본 프로그램의 출력을 효율적으로 업데이트하는 증분 버전을 생성합니다. 정적 접근 방식은 런타임에 부기가 필요하지 않기 때문에 동적 접근 방식보다 더 효율적일 수 있습니다. 또한 계산 된 증분 버전은 일정한 폴딩 또는 인라인과 같은 표준 컴파일러 기술을 사용하여 최적화 할 수 있습니다. 이것이 (1)에서 조사 된 접근법입니다.

  • 동적 증분. 동적 접근 방식은 프로그램이 실행되는 동안 동적 종속성 그래프를 작성하고 이러한 그래프를 따라 변경 사항을 전파합니다. 가장 잘 알려진 접근법은 Acar의 자체 조정 계산입니다.. 핵심 아이디어는 간단합니다. 프로그램은 동적 종속성 그래프에서 값 사이의 종속성을 추적하는 향상된 런타임 환경에서 원래 입력에서 실행됩니다. 중간 결과가 캐시됩니다. (당신이 상상할 수 있듯이, 이것은 많은 메모리를 사용하는 경향이 있으며,이 분야의 많은 연구는 메모리 사용을 제한하는 방법에 관한 것입니다.) 나중에, 입력에 대한 변경은 변경된 입력에서 결과로 의존성 그래프를 통해 전파되어 중간 및 최종 결과; 이 처리는 종종 재 계산보다 효율적입니다. 그러나 동적 의존성 그래프를 생성하면 런타임 동안보고 된 실험에서 2에서 30까지의 상수 상수 오버 헤드가 커집니다.

또한 주어진 알고리즘의 온라인 버전으로 항상 '수동으로'시도 할 수 있습니다. 어려울 수 있습니다.


(1) Y. Cai, PG Giarrusso, T. Rendel, K. Ostermann, 고차 언어 변경 이론 : 정적 미분에 의한 λ- 계수 증가 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.