【发布时间】:2021-09-03 09:27:07
【问题描述】:
我有一个模拟,每一步都会生成数据。我将数据存储在内存中。
经过一定数量的步骤后,我从存储的数据创建了一个 pandas 数据框,并使用df.to_csv 写入(附加)到文件。
我可以从字典列表或列表字典(其中值是列表)创建数据框。其中哪一项会给我更好的性能和内存管理?
选项 A:
data = []
d={'a':1, 'b': 2} # Data from one step
data.append(d)
d={'a':2, 'b': 3} # Data from another step
data.append(d)
# data = [{'a':1, 'b':2}, {'a':2, 'b':3}]
df = pd.DataFrame(data)
with open(output_file, 'a') as f:
df.to_csv(f, sep=",", index=False, header=f.tell()==0)
# Header added at first write
或 选项 B:
data = {'a':[], 'b':[]}
data['a'].append(1) # Data from one step
data['b'].append(2)
data['a'].append(2) # Data from another step
data['b'].append(3)
# data = {'a':[1,2], 'b':[2,3]}
df = pd.DataFrame(data)
with open(output_file, 'a') as f:
df.to_csv(f, sep=",", index=False, header=f.tell()==0)
# Header added at first write
我有10^5 到10^8 的数据步骤。我想把写作分成几部分。也就是说,
- 在内存中存储
n步骤的数据 - 创建数据框并从
n步骤写入数据 - 从内存中清除过去的
n步骤数据,并为接下来的n步骤重复 1 和 2,依此类推...
所以你基本上可以把上面的 sn-ps 想象成循环。我希望在每 n 步数据之后释放内存。我假设在这两种情况下重新声明 data 变量将实现这一点。如果没有,请告知我如何完成此操作,以免内存使用量累积增加。
【问题讨论】:
-
您是否在将数据帧写入 csv 之前对其进行计算?
-
@HenryEcker 不,我只是创建数据框并写入文件。整个模拟完成后,我会从文件中读取并使用数据帧处理数据。这也是我开始使用数据框进行写作的原因。
-
如果你有这么多数据,你可以考虑使用二维numpy数组,并在创建数据框时单独传递列名,而不是使用字典/列表。这样,执行其他操作也可能会派上用场。
-
@Don'tAccept True,这也是一种可能。我不确定目前哪个效率最高。