Перебирать строки документа параллельно - PullRequest
0 голосов
/ 09 мая 2018

У меня есть документ, который называется словами, и в каждой строке есть новое слово. Я хочу превратить каждое из этих слов в список составляющих его символов. Я делаю это, просто делая list(x), где х - это слово.

Это то, что я делаю, но я хочу способ распараллелить это:

split = []
with open('wordprob.txt','rt') as lines:
    for line in lines:
        split.append(list(line))

Я использую этот подход, чтобы мне не приходилось загружать весь файл (более 3 ГБ) в память. При распараллеливании его путем первой загрузки файла мое использование памяти превышает 16 ГБ.

Как я могу распараллелить его без загрузки файла в память, как в цикле выше?

Спасибо!

РЕДАКТИРОВАТЬ: Ниже было указано, что список будет занимать много памяти. Вместо этого, как мне хранить каждый список символов (первоначально из одного слова) в виде строки с разделителями-пробелами в новой строке нового документа. Я снова ищу параллельное решение.

1 Ответ

0 голосов
/ 09 мая 2018

Если я правильно понимаю проблему, у вас есть файл, такой как

sushi
banana
sujuk
strawberry
tomato
pho
ramen
manaqish

и вы хотите создать новый файл , например:

s u s h i
b a n a n a
s u j u k
s t r a w b e r r y
t o m a t o
p h o
r a m e n
m a n a q i s h

тогда вы можете написать простую программу stdin-stdout, что-то вроде

import sys
for line in sys.stdin:
    sys.stdout.write(' '.join(list(line)))

Если все данные отправляются в один и тот же файл, то даже при распараллеливании каждый из ваших потоков или процессов будет конкурировать для записи в один и тот же выходной файл.

Если вы действительно хотите распараллелить и хотите придерживаться Python, вы можете использовать потоковую передачу Hadoop. Ваша работа будет только для картографов; на самом деле картограф - это трехстрочный скрипт, описанный выше. Но я не уверен, что это вам выгодно, если ваш набор данных не будет смехотворно большим. Преобразование довольно простое, но не стесняйтесь профилировать работу, чтобы увидеть, если вы получите много пользы.

Я не думаю, что 3ГБ это очень много, но это может быть забавным упражнением в Hadoop (или чем-то, что дети используют в эти дни.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...