Я хочу обучить модель на ~ 100 000 текстовых файлов. Pandas столкнулся с некоторыми проблемами с памятью, поэтому решил перейти на Dask.
Я пытаюсь прочитать файлы в Dask DataFrame, в котором пути к файлам уже сохранены. В пандах я мог бы просто сделать следующее:
ddf['rawtext'] = [open(file, 'rt').read() for file in ddf['filepath']]
Но это дает ошибку NotImplementedError.
Есть ли способ эффективно читать текстовые файлы в Dask?
В pandas вам просто нужно указать путь к одному файлу, и он будет обрабатывать операции I/O за вас, нет необходимости открывать каждый файл и передавать его в список.
Dask, как и многие другие крупные фреймворки, может принимать каталог объектов и читать их за один раз.
Из документов.
!ls data/*.csv | head
data/2000-01-01.csv
data/2000-01-02.csv
data/2000-01-03.csv
data/2000-01-04.csv
data/2000-01-05.csv
data/2000-01-06.csv
data/2000-01-07.csv
data/2000-01-08.csv
data/2000-01-09.csv
data/2000-01-10.csv
dd.read_csv('data/2000-*-*.csv')
В вашем случае я бы предположил, что это
dd.read_csv('data/*.txt')
То, что вы можете сделать в Pandas, вы можете сделать в Dask, используя map или map_partitions
def read_them(df):
df['rawtext'] = [open(file, 'rt').read() for file in ddf['filepath']]
return df
ddf2 = ddf.map_partitions(read_them)
ИЛИ
ddf2 = ddf.assign(
raw_text=ddf.filepath.map(lambda x: open(x, 'rt').read())
)
В первом варианте может быть больше символов, но он проще и больше соответствует исходному коду. Какую бы обработку (построчно) вы ни хотели сделать со своим текстом дальше, вы все равно можете делать это в той же функции.
Спасибо, но единственная проблема, которая у меня есть, заключается в том, что использование read_csv правильно читает файл. Каждый текстовый файл представляет собой несколько строк, которые я хочу сохранить в одной ячейке. установка sep=None приводит к ParserError