Я хочу оптимизировать функцию, которая принимает в качестве аргумента Серию, заполненную большими строками текста, а затем возвращает DataFrame, каждый столбец которого заполняется словами из входящего текста. Это то, что я делал, чтобы добиться этого:
Скажем, что входная серия X:
X.str.split()\
.apply(pd.Series)
Это работает, но для больших наборов данных требуется огромное количество памяти. Это было также тогда, когда я понял, что весь набор данных может не полностью поместиться в память как плотный DataFrame. Итак, я попробовал это:
Y = X.str.split()
U = list(map(lambda x: pd.SparseArray(x), Y.to_list(x)))
Z = pd.DataFrame(U)
Я не использовал pd.SparseDataFrame
, потому что он устарел и не работает, когда я передаю его другим функциям в коде.
Проблема с этой попыткой сейчас состоит в том, что строка для Z
занимает слишком много времени для обработки, возможно, потому что я не реализовал это правильно. Итак, мой вопрос: как мне сделать так, чтобы это не занимало вечность? Я также пытался поиграть с dask, но я слишком новичок в этом, чтобы придумать что-нибудь приличное.
Edit
Мне удалось использовать dask для распространениявычисление на двух компьютерах с использованием следующего:
import dask.dataframe as dd
from dask.distributed import Client
client = Client("address")
max_cols = D.str.count(" ").max().compute()+1
X = client.scatter(X)
S = client.submit(lambda x: x.str.split(n=max_cols, expand=True),X)
Это окончательно решает проблему с памятью, поскольку я могу ограничить ее из настроек кластера, но теперь используется только одно ядро, хотя их 16их в наличии. Как я могу это исправить?