IPython.parallel ValueError:无法从内存缓冲区创建OBJECT数组

时间:2013-06-09 19:41:59

标签: python ipython scikit-learn ipython-parallel

我正在尝试编写一个在多个IPython引擎中执行的函数。该函数将pandas Series作为参数。该系列的每个元素都是一个字符串,整个系列构成了TF.IDF计算的语料库。

在阅读了IPython并行文档和一些教程之后,它似乎非常简单,我想出了以下内容:

import pandas as pd
from IPython.parallel import Client


def calculemus(corpus):
    from sklearn.feature_extraction.text import TfidfVectorizer

    vectorizer = TfidfVectorizer(min_df=1, stop_words='english')

    return vectorizer.fit_transform(corpus)


review = pd.read_csv('review.csv')['text']
review = review.fillna('')

client = Client()

r = client[-1].apply(calculemus, review).get()

但是我收到了这个错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)/xxx/site-packages/IPython/zmq/serialize.pyc in unpack_apply_message(bufs, g, copy)
    154                     sa.data = m.bytes
    155 
--> 156     args = uncanSequence(map(unserialize, sargs), g)
    157     kwargs = {}
    158     for k in sorted(skwargs.iterkeys()):
/xxx/site-packages/IPython/utils/newserialized.pyc in unserialize(serialized)
    175 
    176 def unserialize(serialized):
--> 177     return UnSerializeIt(serialized).getObject()
/xxx/site-packages/IPython/utils/newserialized.pyc in getObject(self)
    159                 buf = self.serialized.getData()
    160                 if isinstance(buf, (bytes, buffer, memoryview)):
--> 161                     result = numpy.frombuffer(buf, dtype = self.serialized.metadata['dtype'])
    162                 else:
    163                     raise TypeError("Expected bytes or buffer/memoryview, but got %r"%type(buf))
ValueError: cannot create an OBJECT array from memory buffer

我不确定问题是什么,有人可以启发我吗?


更新

显然这个错误确切地说明了它的内容。如果我这样做:

r = client[-1].apply(calculemus, np.array(review, dtype=str)).get()
它有点工作。

所以下一个问题是,这是IPython的功能还是限制?

1 个答案:

答案 0 :(得分:2)

这是IPython 0.13中的一个错误,应该在master中修复。序列化numpy数组有一种特殊情况可以避免复制数据,这种行为是由isinstance(numpy.ndarray)检查触发的。这是不合适的,因为isinstance捕获了包含pandas对象的子类,但是那些pandas对象(以及一般的数组子类)应该以相同的方式处理 not ,因为元数据将丢失而另一方的重建往往会失败。

PS:

r = client[-1].apply(calculemus, np.array(review, dtype=str)).get()

相当于

r = client[-1].apply_sync(calculemus, np.array(review, dtype=str))