我有大约70gb的MD模拟输出。在文件中定期重复行数固定说明的模式和行数固定数据。如何在Dask Dataframe中逐块读取文件,忽略解释行?
我成功地在pandas.read_csv的skiprows参数中编写了一个lambda函数,以忽略解释行,而仅读取数据行。我将输入的熊猫代码转换为简单的代码,但是它不起作用。在这里,您可以看到用dd.read_csv替换pandas.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行的natoms大小的块。直到读取所有数据快照后,这种情况才会发生。 不幸的是,尽管上面的代码在熊猫中很好用,但在dask中却行不通。如何在dask数据框中实现类似的过程?
答案 0 :(得分:0)
dask数据框read_csv函数在字节位置剪切文件。无法确切确定每个分区中有多少行,因此依赖每个分区中的行索引是不明智的。
如果还有其他方法可以检测到不良线路,那么我会尝试这样做。理想情况下,您将能够根据行的内容而不是其在文件中的位置(如每八行)来确定错误的行。