python - 如何减少内存使用并加快代码速度

标签 python pandas out-of-memory

我正在使用包含 5 列和超过 9000 万行的庞大数据集。该代码可以很好地处理部分数据,但是当涉及到全部数据时,我会遇到内存错误。我阅读了有关生成器的信息,但对我来说它似乎非常复杂。我可以根据这段代码得到解释吗?

df = pd.read_csv('D:.../test.csv', names=["id_easy","ordinal", "timestamp", "latitude", "longitude"])

df = df[:-1]
df.loc[:,'timestamp'] = pd.to_datetime(df.loc[:,'timestamp'])
pd.set_option('float_format', '{:f}'.format)
df['epoch'] = df.loc[:, 'timestamp'].astype('int64')//1e9
df['day_of_week'] = pd.to_datetime(df['epoch'], unit="s").dt.weekday_name
del df['timestamp']

for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:
    day_df = df.loc[df['day_of_week'] == day]
    day_df.to_csv(f'{day}.csv', index=False,)

最后一个for循环操作出现错误

示例数据:

d4ace40905729245a5a0bc3fb748d2b3    1   2016-06-01T08:18:46.000Z    22.9484 56.7728
d4ace40905729245a5a0bc3fb748d2b3    2   2016-06-01T08:28:05.000Z    22.9503 56.7748

已更新

我这样做了:

chunk_list = []  

for chunk in df_chunk:  
    chunk_list.append(chunk)
df_concat = pd.concat(chunk_list)

我现在不知道如何进行?如何应用其余代码?

最佳答案

我的建议是切换到 DaskSpark .

如果您想继续使用 pandas,请尝试以下提示来读取 CSV 文件,使用 pandas.read_csv :

  1. chunksize 参数:允许您一次读取一个文件。为了 例如,在您的情况下,您可以使用等于一百万的 block 大小,您 会得到 90 个 block ,你可以对每个 block 进行操作 单独。
  2. dtype 参数:使用此参数,您只需传递一个字典即可指定每一列的数据类型:{'a': np.float32, 'b': np .int32, 'c': 'Int32'}
    Pandas 可以使用 64 位数据类型,而 32 位可能就足够了。使用此技巧,您可以节省 50% 的空间。

您的案例研究

试试这个代码:

df_chunks = pd.read_csv('test.csv', chunksize=1000000, iterator=True, 
                         parse_dates=['timestamp'], error_bad_lines=False,
                         dtype={"ordinal":'int32', "latitude": 'float32', "longitude":'float32'})
for chunk in df_chunks:
    # chunk = chunk.apply(...) # process the single chunk 
    for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:
        day_df = chunk.loc[chunk['day_of_week'] == day]
        day_df.to_csv(f'{day}.csv', mode='a', index=0, header=False)

通过这种方式,您一次可以处理一大块数据,而无需同时处理所有数据。 mode='a' 告诉 pandas 追加。

注1: 此处不需要 pandas.concatiteratorchunksize=1000000 唯一做的就是给你一个读取器对象, iterates 1000000 行数据帧,而不是读取整个内容。使用 concat 你失去了使用 iterators 和将整个文件加载到内存中的所有优势,就像使用 csv 法则而不指定 block 大小一样。

注意 2:如果 'MemoryError' 错误仍然存​​在,请尝试更小的 block 大小。

关于python - 如何减少内存使用并加快代码速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157958/

相关文章:

Java OutOfMemoryError 奇怪的行为

python - wxPython多线程matplotlib绘图不在主线程中

python - Xaxis 标签与数据点不匹配 - Pandas/Matplotlib

Python Pandas 计算不包括当前组的标准偏差,带有矢量化解决方案

java - 如何在不出现内存不足错误的情况下将应用程序 Assets 文件夹中的大文件写入 SD 卡?

解码位图流时Android应用程序OutOfMemoryError

python - 使用python更改dxf文件中的图层名称

python - 在pyqt中使用按钮和对象

python - 在 Jinja 2 的包含文件顶部插入 javascript

python - seaborn : plotting time on x-axis