以上就是给各位分享如何在python子进程之间传递大型numpy数组而不保存到磁盘?,其中也会对python子进程进行解释,同时本文还将给你拓展json–如何使用flask发送和接收大型numpy数组
以上就是给各位分享如何在python子进程之间传递大型numpy数组而不保存到磁盘?,其中也会对python 子进程进行解释,同时本文还将给你拓展json – 如何使用flask发送和接收大型numpy数组(几GB)、python ctypes – 传递numpy数组 – 奇数输出、python numpy数组的numpy数组、python – numpy数组项目之间的最小平方差异等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- 如何在python子进程之间传递大型numpy数组而不保存到磁盘?(python 子进程)
- json – 如何使用flask发送和接收大型numpy数组(几GB)
- python ctypes – 传递numpy数组 – 奇数输出
- python numpy数组的numpy数组
- python – numpy数组项目之间的最小平方差异
如何在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)
这是我的客户方:
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数组 – 奇数输出
它给了我奇怪的输出行为.
下面是一些代码:
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数组
我在创建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数组项目之间的最小平方差异
现在我对计算很不满意,可以使用一些帮助.
我有一个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
我会很感激任何提示.
解决方法
>>> 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数组项目之间的最小平方差异的相关信息,请在本站寻找。
本文标签: