【发布时间】:2019-11-12 05:07:20
【问题描述】:
对于我的应用程序,我需要读取多个文件,每个文件有 15 M 行,将它们存储在 DataFrame 中,并将 DataFrame 保存为 HDFS5 格式。
我已经尝试过不同的方法,特别是具有 chunksize 和 dtype 规范的 pandas.read_csv 和 dask.dataframe。他们都需要大约 90 秒来处理 1 个文件,所以我想知道是否有办法以所述方式有效地处理这些文件。下面,我展示了一些我已经完成的测试的代码。
import pandas as pd
import dask.dataframe as dd
import numpy as np
import re
# First approach
store = pd.HDFStore('files_DFs.h5')
chunk_size = 1e6
df_chunk = pd.read_csv(file,
sep="\t",
chunksize=chunk_size,
usecols=['a', 'b'],
converters={"a": lambda x: np.float32(re.sub(r"[^\d.]", "", x)),\
"b": lambda x: np.float32(re.sub(r"[^\d.]", "", x))},
skiprows=15
)
chunk_list = []
for chunk in df_chunk:
chunk_list.append(chunk)
df = pd.concat(chunk_list, ignore_index=True)
store[dfname] = df
store.close()
# Second approach
df = dd.read_csv(
file,
sep="\t",
usecols=['a', 'b'],
converters={"a": lambda x: np.float32(re.sub(r"[^\d.]", "", x)),\
"b": lambda x: np.float32(re.sub(r"[^\d.]", "", x))},
skiprows=15
)
store.put(dfname, df.compute())
store.close()
这是文件的样子(空格由文字制表符组成):
a b
599.998413 14.142895
599.998413 20.105534
599.998413 6.553850
599.998474 27.116098
599.998474 13.060312
599.998474 13.766775
599.998596 1.826706
599.998596 18.275938
599.998718 20.797491
599.998718 6.132450)
599.998718 41.646194
599.998779 19.145775
【问题讨论】:
-
提供样本数据
-
我收到了
size is too big (>30 MB)错误。您可以在问题正文中添加 5-10 行。 -
为什么要使用 read_csv 方法读取 XML?如果这段代码有效(它不在我的计算机上),只需删除这些正则表达式并在之前编译它们(或者更好,使用 str.replace 代替)
-
其实我读的是.txt文件。我只是以这种格式插入了一些值作为示例。使用正则表达式是因为文件可能包含一些值,如“10.042)”,所以我不想阅读“)”。
标签: python pandas dataframe dask