fbpx

Обработка строк из excel и многопоточность

264 просмотра
0
0 Комментариев

Требуется взять из excel таблицы строки (порядка 500000), убрать из них все лишнее и подготовить для обработки в VW.

Задачу выполнить удалось, однако, код выполняется довольно долго (не сильно нагружая при этом систему). Хочу существенно ускорить его выполнение и понять, почему нагрузка на систему низкая.

Я попробовал использовать библиотеку multiprocessing, но существенных изменений во времени работы (а так же в нагрузке на систему) не произошло (это ведь связано с GIL, потому что код не использует сторонних библиотек ?).
Как я вижу решение проблемы: использовать для всех работ со строками библиотеку на С.

В общении с pyhton новичок. Код может быть максимально не правильным, но он работает 🙂

Пожалуйста, помогите оптимизировать программу (изменить код, помочь с поиском библиотеки).

Задачу решил так:

import re
import pandas as pd
from nltk.stem import SnowballStemmer
import multiprocessing as mp
 
def to_vw_format(document, label=None):
    stemmer = SnowballStemmer('russian')
    reg = re.compile('[^а-яА-Яa-zA-Z0-9- ]')
    if type(document) == int:
        document = str(document)
    document = reg.sub(' ', document)
    words = []
    for w in document.split():
        if len(w) > 1:
            words.append(stemmer.stem(w))
    stmstr = ' '.join(words)
    return str(label or '') + ' |text ' + stmstr + '\n'
 
if __name__ == '__main__':
    aa = 3
    df=pd.read_excel(r'123.xlsx', header=None)
    names = [df[0][i] for i in range(df.shape[0]//2)]
    names1 = [df[0][i] for i in range(df.shape[0]//2, df.shape[0])]
    labels = [df[2][i] for i in range(df.shape[0]//2)]
    labels1 = [df[2][i] for i in range(df.shape[0]//2, df.shape[0])]
    if len(names) != len(names1):
        names.append('')
        labels.append('')
 
    train_data = []
 
    with mp.Pool(aa) as pool:
        for i in range(len(names)):
            for result in pool.starmap(to_vw_format, [(names[i], labels[i]), (names1[i], labels1[i])]):
                train_data.append(result)


Добавить комментарий

0 Answers

Python Опубликовано 27.03.2019
Напишите свой ответ на данный вопрос.
Scroll Up