我为点生成编写了代码,它将每1秒生成一个数据帧,并继续生成。每个数据帧有1000行和7列。。它是使用while循环实现的,因此每次迭代都会生成一个数据帧,并且必须将其附加在文件上。我应该使用什么文件格式来管理内存效率?哪种文件格式占用的内存较少。?谁能给我个建议吗。。可以使用csv吗?如果是,我应该使用什么数据类型。。目前我的数据帧有int16值。。我应该附加相同的还是应该将其转换为二进制格式或字节格式?
numpy
数组可以以二进制格式存储。由于您只有一个int16
数据类型,因此可以创建一个numpy数组并编写它。每个int16值有2个字节,这对于大小来说相当不错。诀窍是,当您稍后读取存储的数据时,您需要知道数据的维度。在这个例子中,它是硬编码的。这有点脆弱——如果你改变主意,以后开始使用不同的维度,旧数据将不得不转换。
假设您稍后想要读取一堆1000x7的数据帧,那么您可以执行类似以下示例的操作。编写器不断追加1000x7的int16,读取器将它们分块返回到数据帧中。如果你不使用任何特定于panda本身的东西,那么你最好在所有操作中都使用numpy,并跳过演示的转换。
import pandas as pd
import numpy as np
def write_df(filename, df):
with open(filename, "ab") as fp:
np.array(df, dtype="int16").tofile(fp)
def read_dfs(filename, dim=(1000,7)):
"""Sequentially reads dataframes from a file formatted as raw int16
with dimension 1000x7"""
size = dim[0] * dim[1]
with open(filename, "rb") as fp:
while True:
arr = np.fromfile(fp, dtype="int16", count=size)
if not len(arr):
break
yield pd.DataFrame(arr.reshape(*dim))
import os
# ready for test
test_filename = "test123"
if os.path.exists(test_filename):
os.remove(test_filename)
df = pd.DataFrame({"a":[1,2,3], "b":[4,5,6]})
# write test file
for _ in range(5):
write_df(test_filename, df)
# read and verify test file
return_data = [df for df in read_dfs(test_filename, dim=(3,2))]
assert len(return_data) == 5