很抱歉,我无法用更简单的示例重现错误,而且我的代码太复杂而无法发布.如果我在IPython shell而不是常规Python中运行程序,那么事情就会很顺利.
我查看了之前关于这个问题的一些注意事项.它们都是由在类函数中定义的pool to call函数引起的.但对我来说情况并非如此.
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何帮助.
更新:我挑选的功能是在模块的顶层定义的.虽然它调用包含嵌套函数的函数.即f()要求g()调用h()具有嵌套函数i(),和我打电话pool.apply_async(f).f(),g(),h()都在顶层定义.我用这个模式尝试了更简单的例子,但它确实有效.
我正在寻找一种快速保存大型numpy数组的方法.我想以二进制格式将它们保存到磁盘,然后相对快速地将它们读回内存.不幸的是,cPickle还不够快.
我找到了numpy.savez和numpy.load.但奇怪的是,numpy.load将npy文件加载到"memory-map"中.这意味着定期操作数组确实很慢.例如,像这样的东西会非常慢:
#!/usr/bin/python
import numpy as np;
import time;
from tempfile import TemporaryFile
n = 10000000;
a = np.arange(n)
b = np.arange(n) * 10
c = np.arange(n) * -0.5
file = TemporaryFile()
np.savez(file,a = a, b = b, c = c);
file.seek(0)
t = time.time()
z = np.load(file)
print "loading time = ", time.time() - t
t = time.time()
aa = z['a']
bb = z['b']
cc = z['c']
print "assigning time = ", time.time() - t; …Run Code Online (Sandbox Code Playgroud) 假设我有一个大内存numpy数组,我有一个函数func,它接受这个巨大的数组作为输入(连同一些其他参数).func具有不同参数可以并行运行.例如:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
Run Code Online (Sandbox Code Playgroud)
如果我使用多处理库,那么这个巨型数组将被多次复制到不同的进程中.
有没有办法让不同的进程共享同一个数组?此数组对象是只读的,永远不会被修改.
更复杂的是,如果arr不是一个数组,而是一个任意的python对象,有没有办法分享它?
[EDITED]
我读了答案,但我仍然有点困惑.由于fork()是copy-on-write,因此在python多处理库中生成新进程时不应调用任何额外的成本.但是下面的代码表明存在巨大的开销:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = …Run Code Online (Sandbox Code Playgroud) python parallel-processing numpy shared-memory multiprocessing
请参阅以下代码:
import datetime
import pytz
fmt = '%Y-%m-%d %H:%M:%S %Z'
d = datetime.datetime.now(pytz.timezone("America/New_York"))
d_string = d.strftime(fmt)
d2 = datetime.datetime.strptime(d_string, fmt)
print d_string
print d2.strftime(fmt)
Run Code Online (Sandbox Code Playgroud)
输出是
2013-02-07 17:42:31 EST
2013-02-07 17:42:31
Run Code Online (Sandbox Code Playgroud)
时区信息在翻译中丢失了.
如果我将'%Z'切换为'%z',我明白了
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用python-dateutil,但我发现它很棒,我无法在datetime实现这个简单的功能,并且必须引入更多的依赖?
我意识到Python 中的csv库总是生成DOS行尾字符.即使我使用该'wb'模式,即使我使用Linux.
import csv
f = open('output.txt', 'wb');
writer = csv.writer(f)
writer.writerow([2,3,4]);
f.close()
Run Code Online (Sandbox Code Playgroud)
以上代码始终'\r\n'用作行结束分隔符.我怎样才能使用它'\n'?
例如,我有一个程序用作侦听端口5000的TCP服务器.
现在我想运行另一个命令行进程与该服务器并行运行.我知道正确的方法是分叉服务器,而不是调用"exec"....
我的问题是,子进程是否也"拥有"这个端口5000?如果我想释放这个端口5000,我是否需要杀死父进程和子进程?
我很好奇如何在分叉中处理这个套接字连接.
我有一个非常复杂的shell脚本,在其中调用我想通过GDB调试的C++程序.将c ++程序与shell分离是非常困难的,因为它有很多分支和很多环境变量设置.
有没有办法在这个shell脚本上调用GDB?看起来gdb需要我直接调用C++程序.
我知道STL容器会复制对象.所以说我有一个
list<SampleClass> l;
Run Code Online (Sandbox Code Playgroud)
每当我这样做
SampleClass t(...);
l.push_back(t);
Run Code Online (Sandbox Code Playgroud)
将制作一份副本.如果SampleClass很大,那么它将非常昂贵.
但是,如果我将l声明为引用的容器,
list<SampleClass&> l;
Run Code Online (Sandbox Code Playgroud)
当我做
l.push_back(t);
Run Code Online (Sandbox Code Playgroud)
它会避免复制对象吗?
当我做
ArrayList<Integer> arr = new ArrayList<Integer>(10);
arr.set(0, 1);
Run Code Online (Sandbox Code Playgroud)
Java给了我
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.set(Unknown Source)
at HelloWorld.main(HelloWorld.java:13)
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以预先保留ArrayList的大小,然后立即使用索引,就像数组一样?
我在使用python多处理库时遇到了一个奇怪的问题.
我的代码概述如下:我为每个"符号,日期"元组生成一个进程.我之后结合了结果.
我希望当一个进程完成"符号,日期"元组的计算时,它应该释放它的内存吗?显然情况并非如此.我看到几十个进程(虽然我将进程池设置为大小为7),这些进程在机器中被挂起¹.它们不消耗CPU,也不释放内存.
在完成计算后,如何让进程释放其内存?
谢谢!
¹"暂停"我的意思是他们在ps命令中的状态显示为"S +"
def do_one_symbol( symbol, all_date_strings ):
pool = Pool(processes=7)
results = [];
for date in all_date_strings:
res = pool.apply_async(work, [symbol, date])
results.append(res);
gg = mm = ss = 0;
for res in results:
g, m, s = res.get()
gg += g;
mm += m;
ss += s;
Run Code Online (Sandbox Code Playgroud)