内存与磁盘上的数据大小

Aar*_*ler 10 python memory ram diskspace

将数据存储在内存中所需的RAM与将相同数据存储在文件中所需的磁盘空间相比如何?或者没有广义相关性?

例如,假设我只有十亿个浮点值.以二进制形式存储,磁盘上有40亿字节或3.7GB(不包括标题等).然后说我把这些值读入Python的列表中......我应该要求多少RAM?

tmt*_*prt 6

Python对象数据大小

如果数据存储在某些python对象中,则内存中的实际数据将附加一些数据。

这很容易测试。

各种形式的数据大小

有趣的是,起初,python对象的开销对于小数据是如何显着的,但是很快就可以忽略不计了。

这是用于生成绘图的iPython代码

%matplotlib inline
import random
import sys
import array
import matplotlib.pyplot as plt

max_doubles = 10000

raw_size = []
array_size = []
string_size = []
list_size = []
set_size = []
tuple_size = []
size_range = range(max_doubles)

# test double size
for n in size_range:
    double_array = array.array('d', [random.random() for _ in xrange(n)])
    double_string = double_array.tostring()
    double_list = double_array.tolist()
    double_set = set(double_list)
    double_tuple = tuple(double_list)

    raw_size.append(double_array.buffer_info()[1] * double_array.itemsize)
    array_size.append(sys.getsizeof(double_array))
    string_size.append(sys.getsizeof(double_string))
    list_size.append(sys.getsizeof(double_list))
    set_size.append(sys.getsizeof(double_set))
    tuple_size.append(sys.getsizeof(double_tuple))

# display
plt.figure(figsize=(10,8))
plt.title('The size of data in various forms', fontsize=20)
plt.xlabel('Data Size (double, 8 bytes)', fontsize=15)
plt.ylabel('Memory Size (bytes)', fontsize=15)
plt.loglog(
    size_range, raw_size, 
    size_range, array_size, 
    size_range, string_size,
    size_range, list_size,
    size_range, set_size,
    size_range, tuple_size
)
plt.legend(['Raw (Disk)', 'Array', 'String', 'List', 'Set', 'Tuple'], fontsize=15, loc='best')
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的。sys.getsizeof 的文档指出“只考虑直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。” 因此,您只考虑了在容器中分配的内存,而没有考虑为 number 对象本身分配的额外内存。 (2认同)