小编Ven*_*tta的帖子

Python多处理PicklingError:无法pickle <type'function'>

很抱歉,我无法用更简单的示例重现错误,而且我的代码太复杂而无法发布.如果我在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()都在顶层定义.我用这个模式尝试了更简单的例子,但它确实有效.

python pickle multiprocessing python-multiprocessing

217
推荐指数
6
解决办法
19万
查看次数

保留磁盘上的numpy数组的最佳方法

我正在寻找一种快速保存大型numpy数组的方法.我想以二进制格式将它们保存到磁盘,然后相对快速地将它们读回内存.不幸的是,cPickle还不够快.

我找到了numpy.saveznumpy.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)

python numpy pickle binary-data preserve

116
推荐指数
6
解决办法
8万
查看次数

多处理中的共享内存对象

假设我有一个大内存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

112
推荐指数
4
解决办法
10万
查看次数

Python datetime strptime()和strftime():如何保存时区信息

请参阅以下代码:

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 datetime python-datetime python-dateutil

49
推荐指数
2
解决办法
16万
查看次数

Python csv writer总是使用DOS行尾字符吗?

我意识到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'

python csv line-endings writer

35
推荐指数
2
解决办法
2万
查看次数

如何在分叉进程中处理套接字连接

例如,我有一个程序用作侦听端口5000的TCP服务器.

现在我想运行另一个命令行进程与该服务器并行运行.我知道正确的方法是分叉服务器,而不是调用"exec"....

我的问题是,子进程是否也"拥有"这个端口5000?如果我想释放这个端口5000,我是否需要杀死父进程和子进程?

我很好奇如何在分叉中处理这个套接字连接.

sockets port fork tcp process

32
推荐指数
2
解决办法
1万
查看次数

使用GDB调试从shell脚本调用的C++程序

我有一个非常复杂的shell脚本,在其中调用我想通过GDB调试的C++程序.将c ++程序与shell分离是非常困难的,因为它有很多分支和很多环境变量设置.

有没有办法在这个shell脚本上调用GDB?看起来gdb需要我直接调用C++程序.

c++ debugging shell gdb

28
推荐指数
2
解决办法
2万
查看次数

参考对象的STL容器

我知道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)

它会避免复制对象吗?

c++ stl reference pass-by-reference

28
推荐指数
3
解决办法
2万
查看次数

Java ArrayList IndexOutOfBoundsException尽管给出了初始容量

当我做

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的大小,然后立即使用索引,就像数组一样?

java arrays arraylist

25
推荐指数
2
解决办法
6598
查看次数

Python多处理 - 如何在进程完成后释放内存?

我在使用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)

python memory multiprocessing

24
推荐指数
2
解决办法
1万
查看次数