我有一个ASCII文件,本质上是一个16位有符号整数的网格;磁盘上的文件大小约为300MB。我不需要将文件读入内存,但需要将其内容存储为单个容器(容器),因此对于内存使用的初始测试,我尝试list
和tuples
作为内部容器外容器始终作为list
通过列表理解:
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倍。每个容器是否真的占用了那么多的内存空间来容纳一行?
答案 0 :(得分:1)
如果您担心将数据存储在内存中并且不想使用标准库之外的工具,您可能需要查看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()