1 #!/usr/bin/env -S guile -s
4 (add-to-load-path "..")
7 (use-modules (srfi srfi-1))
8 (use-modules (ice-9 regex))
9 (use-modules (ice-9 ftw))
10 (use-modules (ice-9 textual-ports))
15 (define (read-db-numbers db-lst)
16 (define db-numbers '())
18 (for-each (lambda (db)
19 (let ((port (open-file (format #f "./numbers-db/~a" db) "r")))
20 (let lp ((line (get-line port)))
21 (if (not (eof-object? line))
23 (set! db-numbers (cons (string->number line) db-numbers))
28 (define (apply-distributed-proc db-lst)
29 (reduce proc init-value (read-db-numbers db-lst)))
33 (define (partition-db-lists)
34 (define db-lst (scandir "./numbers-db" (lambda (f) (string-match "^.*\\.txt$" f))))
35 (define db-per-worker (euclidean-quotient (length db-lst) (rpc-worker-process-size)))
38 (when (= db-per-worker 0)
39 (error "insufficient db size"))
41 (let lp ((i (1- (rpc-worker-process-size))))
44 (set! dbs (cons (take db-lst db-per-worker) dbs))
45 (set! db-lst (drop db-lst db-per-worker))
48 (set! dbs (cons db-lst dbs))
49 (set! dbs (reverse dbs)))))
50 (map (lambda (k) (cons 'list k)) dbs))
52 (format #t "result is ~d~%"
53 (reduce proc init-value
54 (rpc-apply-scatter apply-distributed-proc (partition-db-lists))))