哪种文件格式在 python 中使用的内存较少?

Which file format uses less memory in python?

我编写了点生成代码,它会每隔一秒生成一个数据帧,并且它会不断生成。每个数据框有 1000 行和 7 列。它是使用 while 循环实现的,因此每次迭代都会生成一个数据框,并且必须将其附加到文件中。我应该使用文件格式来管理内存效率吗?哪种文件格式占用的内存更少。?任何人都可以给我一个建议..可以使用 csv 吗?如果是这样,我应该更喜欢使用哪种数据类型。目前我的数据帧有 int16 值。我应该附加相同的值还是应该将其转换为二进制格式或字节格式?

numpy 数组可以以二进制格式存储。由于您只有一个 int16 数据类型,因此您可以创建一个 numpy 数组并编写它。每个 int16 值有 2 个字节,这对大小来说相当合适。诀窍是您需要在稍后读取时知道存储数据的维度。在这个例子中它是硬编码的。这有点脆弱 - 如果您稍后改变主意并开始使用不同的维度,则必须转换旧数据。

假设你想稍后读取一堆 1000x7 数据帧,你可以像下面的例子那样做。作者不断追加 1000x7 int16s 并且 reader 将它们分块回到数据帧中。如果你不使用任何特定于 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