Фильтрация входного файла с использованием chunksize и skiprows с использованием номера строки в качестве индекса в dask dataframe - PullRequest
0 голосов
/ 03 октября 2019

У меня есть ~ 70 ГБ выходной MD моделирования. Шаблон объяснения с фиксированным числом строк и данных с фиксированным количеством строк регулярно повторяется в файле. Как я могу прочитать файл в блоке Dask Dataframe по фрагменту, в котором строки объяснения игнорируются?

Я успешно написал лямбда-функцию в аргументе skiprows в pandas.read_csv, чтобы игнорировать строки объяснения и только читатьлинии данных. Я преобразовал введенный пандами код в dask один, но он не работает. Здесь вы можете увидеть код dask, написанный путем замены pandas.read_csv на dd.read_csv:

# First extracting number of atoms and hence, number of data lines:
with open(filename[0],mode='r') as file: # The same as Chanil's code
    line = file.readline()
    line = file.readline() 
    line = file.readline()
    line = file.readline() # natoms
    natoms = int(line)

skiplines = 9 # Number of explanation lines repeating after nnatoms lines of data

def logic_for_chunk(index):
    """This function read a chunk """
    if index % (natoms+skiplines) > 8:
       return False
    return True
df_chunk = dd.read_csv('trajectory.txt',sep=' ',header=None,index_col=False,skiprows=lambda x: logic_for_chunk(x),chunksize=natoms)

Здесь индексы информационного кадра - это номера строк файла. Используя приведенный выше код, в первом фрагменте строки от 0 до 8 в файле игнорируются, затем строки от 9 до 58 читаются. На следующем фрагменте строки с 59 по 67 игнорируются, а затем считываются фрагменты размером в натуральную величину из строк с 68 по 117. Это происходит до тех пор, пока все снимки данных не будут прочитаны. К сожалению, хотя приведенный выше код хорошо работает в пандах, он не работает в dask. Как я могу реализовать аналогичную процедуру в dask dataframe?

1 Ответ

0 голосов
/ 09 октября 2019

Функция dask dataframe read_csv разрезает файл в байтовых местах. Он не может точно определить, сколько строк в каждом разделе, поэтому неразумно зависеть от индекса строки в каждом разделе.

Если есть какой-то другой способ обнаружить плохую линию, я бы попробовал это. В идеале вы сможете определить плохую строку на основе содержимого строки, а не ее расположения в файле (как каждая восьмая строка).

...