Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Help request serialize #26

Closed
rosineygp opened this issue Aug 15, 2020 · 3 comments
Closed

Help request serialize #26

rosineygp opened this issue Aug 15, 2020 · 3 comments

Comments

@rosineygp
Copy link
Contributor

rosineygp commented Aug 15, 2020

There is a good way to serialize and deserialize variables... I build a pmap code and it runs creating a subshell and eval... the result is save in /dev/shm/<key> and I need to save it save and back the values

_pmap_with_type () {
    local constructor="${1}"; shift
    local f="${1}"; shift
    local items="${ANON["${1}"]}"; shift

    # core count
    local cores=0
    while read -r line; do
        if [[ "$line" =~ "processor" ]]; then
            ((cores++))
        fi
    done < "/proc/cpuinfo"

    # create id for shared memory
    time_ms; local pmap_id="${ANON["${r}"]}"

    eval "${constructor}"; local new_seq="${r}"

    local index=0
    for v in ${items}; do        
        (
            eval ${f%%@*} "${v}" "${@}" 
            [[ "${__ERROR}" ]] && r= && return 1;

            # send result to shared memory
            echo "${index} ${r} \"${ANON["${r}"]}\"" >> "/dev/shm/pmap_${pmap_id}"
        ) &

        ((index++))
        
        # threads = cores + 1
        if [[ $(jobs -r -p | wc -l) -gt $cores ]]; then
            wait -n
        fi
    done

    # wait for inital threads
    wait
    
    while  IFS= read -r line; do
        declare -a _array_line="(${line})"

        _obj_type "${_array_line[1]}"
        eval "_${r}" "${_array_line[2]}"
        _conj! "${new_seq}" "${r}";

    done < <(sort -n "/dev/shm/pmap_${pmap_id}")
    rm "/dev/shm/pmap_${pmap_id}"

    r="${new_seq}"
}

The result of code execution:

(1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920)


 pmap 8138 ms
(1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920)


 map 32914 ms
@rosineygp
Copy link
Contributor Author

Test code:

(defn fib* [a b n]
  (if (> n 0)
    (fib* b (+ a b) (- n 1))
    a))

(def fib (partial fib* 0 1))

(def l [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
           31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60])

(def t (time-ms))

(println (pmap (fn [x]
                 (fib x)) l))

(println "\n\n" "pmap" (- (time-ms) t) "ms")

(def t (time-ms))

(println (map (fn [x]
  (fib x)) l))

(println "\n\n" "map" (- (time-ms) t) "ms")

@rosineygp
Copy link
Contributor Author

This version contains the patch applied

https://github.com/rosineygp/lines/blob/be3164a300afe37150274bd81a5ea289ff1507ee/flk

@rosineygp
Copy link
Contributor Author

I got good results with this code.

_pmap_with_type () {
    local constructor="${1}"; shift
    local f="${1}"; shift
    local items="${ANON["${1}"]}"; shift

    # core count
    local cores=0
    while read -r line; do
        if [[ "$line" =~ "processor" ]]; then
            ((cores++))
        fi
    done < "/proc/cpuinfo"

    # create id for shared memory
    time_ms; local pmap_id="${ANON["${r}"]}"

    eval "${constructor}"; local new_seq="${r}"

    local index=0
    for v in ${items}; do        
        (
            eval ${f%%@*} "${v}" "${@}" 
            [[ "${__ERROR}" ]] && r= && return 1;

            str "${r}"
            echo -n "\"${ANON["${r}"]}\"" > "/dev/shm/_flk_pmap_${pmap_id}_${index}"
        ) &

        ((index++))
        
        # threads = cores + 1
        if [[ $(jobs -r -p | wc -l) -gt $cores ]]; then
            wait -n
        fi
    done

    # wait for inital threads
    wait
    
    index=0
    for i in ${items}; do
        READ_STR "$(</dev/shm/_flk_pmap_${pmap_id}_${index})"
        _conj! "${new_seq}" "${r}";
        rm "/dev/shm/_flk_pmap_${pmap_id}_${index}"
        ((index++))
    done
    r="${new_seq}"
}

So I will close the request.

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant