IPython.parallel ValueError: невозможно создать массив OBJECT из буфера памяти

Я пытаюсь написать функцию, которая будет выполняться в нескольких движках IPython. Функция принимает Серию панд в качестве аргумента. Каждый элемент Серии является строкой, а вся Серия представляет собой корпус для вычисления 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 ответ

Решение

Это ошибка в IPython 0.13, которая должна быть исправлена ​​в master. Существует особый случай для сериализации массивов numpy, который позволяет избежать копирования данных, и это поведение вызывается isinstance(numpy.ndarray) проверять. Это было неуместно, потому что isinstance ловит подклассы, которые включают объекты pandas, но эти объекты pandas (и подклассы массива в целом) не должны обрабатываться таким же образом, так как метаданные будут потеряны, а восстановление на другой стороне часто будет неудачным.

PS:

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

эквивалентно

r = client[-1].apply_sync(calculemus, np.array(review, dtype=str))
Другие вопросы по тегам