哪种文件格式在 python 中使用更少的内存?
python 209
原文标题 :Which file format uses less memory in python?
我编写了用于生成点的代码,它将每秒生成一个数据帧并继续生成。每个数据帧有 1000 行和 7 列。它是使用 while 循环实现的,因此每次迭代都会生成一个数据帧,并且必须将其附加到文件中。我应该使用文件格式来管理内存效率吗?哪种文件格式占用的内存更少。?谁能给我一个建议..使用csv可以吗?如果是这样,我应该使用什么数据类型。目前我的数据帧具有 int16 值。我应该附加相同的值还是应该将其转换为二进制格式或字节格式?
回复
我来回复-
tdelaney 评论
numpy
数组可以以二进制格式存储。由于您只有一个int16
数据类型,因此您可以创建一个 numpy 数组并编写它。每个 int16 值将有 2 个字节,这对于大小来说是相当好的。诀窍是您在稍后阅读时需要知道存储数据的维度。在这个例子中,它是硬编码的。这有点脆弱 – 如果您改变主意并稍后开始使用不同的维度,则必须转换旧数据。假设您想稍后读取一堆 1000×7 数据帧,您可以执行以下示例的操作。作者不断附加 1000×7 int16s,而读者将它们分块回数据帧。如果您不使用任何特定于 pandas 本身的东西,那么您最好坚持使用 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
2年前