I cannot replicate your first problem with the below code snippet, memory is not pickled as you can see in the screenshot, only the main process holds the 1GB shared memory array:

import ctypes
import time
import numpy as np
import multiprocessing as mp


def subproc(array):
    with array.get_lock():
        np_array = np.ctypeslib.as_array(array.get_obj())
        print(np_array[1000])

    # keep process showing in "top"
    begin = time.time()
    while time.time() - begin < 10:
        a = 1 * 100


if __name__ == "__main__":
    array = mp.Array(ctypes.c_byte, 1000*1024*1024, lock=True)
    with array.get_lock():
        np_array = np.ctypeslib.as_array(array.get_obj())
        np_array.fill(100)
    print("allocated")
    p = mp.Process(target=subproc, args=(array,))
    p2 = mp.Process(target=subproc, args=(array,))
    p.start()
    p2.start()
    print("started")

    # keep process showing in "top"
    begin = time.time()
    while time.time() - begin < 10:
        a = 1 * 100
    p.join()
    p2.join()
    print("joined")



I think the second question might be related to Image.fromarray, see this issue 7