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

乘风 python 209

原文标题Which file format uses less memory in python?

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

原文链接:https://stackoverflow.com//questions/71476390/which-file-format-uses-less-memory-in-python

回复

我来回复
  • tdelaney的头像
    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年前 0条评论