python - 在列表中存储文件使用 10 倍内存作为文件大小

标签 python python-3.x

我有一个 ASCII 文件,它本质上是一个 16 位有符号整数的网格;磁盘上的文件大小约为 300MB。我不需要将文件读入内存,但需要将其内容存储为单个容器(容器),因此对于内存使用的初始测试,我尝试了 listtuples 作为内部容器,外部容器始终作为 列表 通过列表理解:

with open(file, 'r') as f:
    for _ in range(6):
        t = next(f) # skipping some header lines
    # Method 1
    grid = [line.strip().split() for line in f] # produces a 3.3GB container
    # Method 2 (on another run)
    grid = [tuple(line.strip().split()) for line in f] # produces a 3.7GB container

在团队中讨论了网格的使用后,我需要将其作为列表的列表保存到某个时间点,然后我将其转换为元组列表以供程序执行。

我很好奇的是,一个 300MB 的文件如何将其行存储在容器的容器中,并且其总大小是原始原始文件大小的 10 倍。每个容器真的会占用那么多的内存空间来容纳一行吗?

最佳答案

如果您关心将数据存储在内存中并且不想使用标准库之外的工具,您可能想看看 array 模块。它旨在非常有效地在内存中存储数字,array.array 类根据您要存储的数字的特征接受各种类型代码。以下是您可能希望如何调整模块以供您使用的简单演示:

#! /usr/bin/env python3
import array
import io
import pprint
import sys

CONTENT = '''\
Header 1
Header 2
Header 3
Header 4
Header 5
Header 6
 0 1 2 3 4 -5 -6 -7 -8 -9 
 -9 -8 -7 -6 -5 4 3 2 1 0 '''


def main():
    with io.StringIO(CONTENT) as file:
        for _ in range(6):
            next(file)
        grid = tuple(array.array('h', map(int, line.split())) for line in file)
    print('Grid takes up', get_size_of_grid(grid), 'bytes of memory.')
    pprint.pprint(grid)


def get_size_of_grid(grid):
    return sys.getsizeof(grid) + sum(map(sys.getsizeof, grid))


if __name__ == '__main__':
    main()

关于python - 在列表中存储文件使用 10 倍内存作为文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48189278/

相关文章:

python - 将列表分成子列表?

python - 有没有办法标记特定的类方法?

python - 我可以在Windows 10 Pro上使用带有最新pycharm 2016.3.2的docker引擎吗

Python 3 绝对导入不起作用

python - 无法使用 pyside2 和 QtDesigner 在我的主窗口中导入我的小部件

python - 在 Python 中使用 MultiIndex 和 to_excel 时如何使 index=False 或删除第一列

Python GCP 从任何区域获取所有实例

python - 按 groupby 对列进行排序

python - 如何使用 importlib 实现可以动态修改源代码的导入 Hook ?

python-3.x - 如何在 python3 中使用 AST 递归简化数学表达式?