GVKun编程网logo

如何在python子进程之间传递大型numpy数组而不保存到磁盘?(python 子进程)

2

以上就是给各位分享如何在python子进程之间传递大型numpy数组而不保存到磁盘?,其中也会对python子进程进行解释,同时本文还将给你拓展json–如何使用flask发送和接收大型numpy数组

以上就是给各位分享如何在python子进程之间传递大型numpy数组而不保存到磁盘?,其中也会对python 子进程进行解释,同时本文还将给你拓展json – 如何使用flask发送和接收大型numpy数组(几GB)、python ctypes – 传递numpy数组 – 奇数输出、python numpy数组的numpy数组、python – numpy数组项目之间的最小平方差异等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何在python子进程之间传递大型numpy数组而不保存到磁盘?(python 子进程)

如何在python子进程之间传递大型numpy数组而不保存到磁盘?(python 子进程)

有没有一种好方法可以在不使用磁盘的情况下在两个python子进程之间传递大量数据?这是我希望完成的动画片示例:

import sys, subprocess, numpycmdString = """import sys, numpydone = Falsewhile not done:    cmd = raw_input()    if cmd == ''done'':        done = True    elif cmd == ''data'':        ##Fake data. In real life, get data from hardware.        data = numpy.zeros(1000000, dtype=numpy.uint8)        data.dump(''data.pkl'')        sys.stdout.write(''data.pkl'' + ''\\n'')        sys.stdout.flush()"""proc = subprocess.Popen( #python vs. pythonw on Windows?    [sys.executable, ''-c %s''%cmdString],    stdin=subprocess.PIPE,    stdout=subprocess.PIPE,    stderr=subprocess.PIPE)for i in range(3):    proc.stdin.write(''data\n'')    print proc.stdout.readline().rstrip()    a = numpy.load(''data.pkl'')    print a.shapeproc.stdin.write(''done\n'')

这将创建一个子进程,该子进程生成一个numpy数组并将该数组保存到磁盘。然后,父进程从磁盘加载阵列。有用!

问题是,我们的硬件生成数据的速度比磁盘读写速度快10倍。有没有一种方法可以将数据从一个python进程传输到另一个纯粹的内存中,甚至可能不复制数据?我可以做类似参考传递的事情吗?

我第一次尝试纯粹在内存中传输数据非常糟糕:

import sys, subprocess, numpycmdString = """import sys, numpydone = Falsewhile not done:    cmd = raw_input()    if cmd == ''done'':        done = True    elif cmd == ''data'':        ##Fake data. In real life, get data from hardware.        data = numpy.zeros(1000000, dtype=numpy.uint8)        ##Note that this is NFG if there''s a ''10'' in the array:        sys.stdout.write(data.tostring() + ''\\n'')        sys.stdout.flush()"""proc = subprocess.Popen( #python vs. pythonw on Windows?    [sys.executable, ''-c %s''%cmdString],    stdin=subprocess.PIPE,    stdout=subprocess.PIPE,    stderr=subprocess.PIPE)for i in range(3):    proc.stdin.write(''data\n'')    a = numpy.fromstring(proc.stdout.readline().rstrip(), dtype=numpy.uint8)    print a.shapeproc.stdin.write(''done\n'')

这非常慢(比保存到磁盘要慢得多),而且非常脆弱。一定有更好的方法!

只要数据获取过程不会阻止父应用程序,我就不会嫁给“子流程”模块。我短暂地尝试了“多处理”,但到目前为止没有成功。

背景:我们有一块硬件,可以在一系列ctypes缓冲区中生成高达〜2 GB /
s的数据。处理这些缓冲区的python代码正忙于处理大量信息。我想将此信息流与在“主”程序中同时运行的其他几个硬件进行协调,而子进程之间不会相互阻塞。我当前的方法是在保存到磁盘之前将数据在子进程中分解一些,但是最好将全部资金传递给“主”进程。

答案1

小编典典

在四处搜寻有关Joe Kington发布的代码的更多信息时,我发现了numpy-
sharedmem软件包。从这个numpy
/ multiprocessing教程来看,它似乎具有相同的知识遗产(也许基本上是相同的作者?–我不确定)。

使用sharedmem模块,您可以创建一个共享内存的numpy数组(太棒了!),并将其与如下所示的多重处理一起使用:

import sharedmem as shmimport numpy as npimport multiprocessing as mpdef worker(q,arr):    done = False    while not done:        cmd = q.get()        if cmd == ''done'':            done = True        elif cmd == ''data'':            ##Fake data. In real life, get data from hardware.            rnd=np.random.randint(100)            print(''rnd={0}''.format(rnd))            arr[:]=rnd        q.task_done()if __name__==''__main__'':    N=10    arr=shm.zeros(N,dtype=np.uint8)    q=mp.JoinableQueue()        proc = mp.Process(target=worker, args=[q,arr])    proc.daemon=True    proc.start()    for i in range(3):        q.put(''data'')        # Wait for the computation to finish        q.join()           print arr.shape        print(arr)    q.put(''done'')    proc.join()

运行收益

rnd=53(10,)[53 53 53 53 53 53 53 53 53 53]rnd=15(10,)[15 15 15 15 15 15 15 15 15 15]rnd=87(10,)[87 87 87 87 87 87 87 87 87 87]

json – 如何使用flask发送和接收大型numpy数组(几GB)

json – 如何使用flask发送和接收大型numpy数组(几GB)

我正在创建一个在本地使用的微服务.从某些输入我每次都生成一个大矩阵.现在我使用json传输数据,但它真的很慢,成为我的应用程序的瓶颈.

这是我的客户方:

headers={'Content-Type': 'application/json'}

data = {'model': 'model_4',\
        'input': "this is my input."}

r = requests.post("http://10.0.1.6:3000/api/getFeatureMatrix",headers=headers,data=json.dumps(data))

answer = json.loads(r.text)

我的服务器是这样的:

app = Flask(__name__,static_url_path='',static_folder='public')

@app.route('/api/getFeatureMatrix',methods = ['POST'])
def get_feature_matrix():
    arguments = request.get_json()
    #processing ... generating matrix
    return jsonify(matrix=matrix.tolist())

如何发送大型矩阵?

解决方法

最后我最终使用了

np.save(matrix_path,mat)
return send_file(matrix_path+'.npy')

在客户端,我在加载矩阵之前保存矩阵.

python ctypes – 传递numpy数组 – 奇数输出

python ctypes – 传递numpy数组 – 奇数输出

我正在使用ctypes,我正在将一个ndarray传递给一个c函数.
它给了我奇怪的输出行为.
下面是一些代码:

C-功能:

int foo(int * foo,int N){
for(int i=0;i<N;i++){
    cout << "i " << i  << " "<< foo[i]  << endl;
    }
return 0;
}

Python:

from ctypes import *
import numpy as np
bar = cdll.LoadLibrary(".../libtest.so")
N = c_int(10)
check = np.ones(10,dtype=int)
print check
bar.foo(c_int(check.ctypes.data),N)

输出:

[1 1 1 1 1 1 1 1 1 1]
i:0 out:1
i:1 out:0
i:2 out:1
i:3 out:0
i:4 out:1
i:5 out:0
i:6 out:1
i:7 out:0
i:8 out:1
i:9 out:0

一切都对吗?

总结

以上是小编为你收集整理的python ctypes – 传递numpy数组 – 奇数输出全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

python numpy数组的numpy数组

python numpy数组的numpy数组

我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它:

a=np.array([])
while(...):
   ...
   b= //a numpy array generated
   a=np.append(a,b)
   ...

所需结果:

[[1,5,3],[9,10,1],...,[4,8,6]]

实际结果:

[1,3,9,1,... 4,6]

可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。

python – numpy数组项目之间的最小平方差异

python – numpy数组项目之间的最小平方差异

我刚开始学习一些numpy因为 High performance calculation of least squares difference from all possible combinations (n lists):

现在我对计算很不满意,可以使用一些帮助.

我有一个numpy数组对象,如下所示:

>>> items
array([[ 246,1143,1491,...,1167,325,1158],[ 246,519,507,[1491,246,1158]])

我希望得到所有成员之间差异最小的阵列数,一个numpythonic版本:

for num,item in enumerate(items): #Calculate for each list of items
      for n in range(len(item)):
        for i in range(n,len(item)):
          dist += (item[n]-item[i])**2 #Key formula
          if dist>min_dist: #This is a shortcut
              break
          else:
              continue
          break               
      if min_dist is None or dist < min_dist:
        min_dist = dist
        best = num #We get the number of the combination we want

我会很感激任何提示.

解决方法

初始化您的NxM阵列:

>>> import numpy as np
>>> items = np.random.random_sample((10,3))

计算每个N M维向量的所有元素之间的平方和,并将结果存储在列表中:

>>> sq = [(np.subtract.outer(item,item) ** 2).sum() for item in items]

找到所有元素之间具有最小平方和的向量索引:

>>> best_index = np.argmin(sq)

或者,为了避免中间列表:

best = np.inf
best_index = None
for i,item in enumerate(items):
    ls = (np.subtract.outer(item,item) ** 2).sum()
    if ls < best:
        best = ls
        best_index = i

关于如何在python子进程之间传递大型numpy数组而不保存到磁盘?python 子进程的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于json – 如何使用flask发送和接收大型numpy数组(几GB)、python ctypes – 传递numpy数组 – 奇数输出、python numpy数组的numpy数组、python – numpy数组项目之间的最小平方差异的相关信息,请在本站寻找。

本文标签: