为什么Python 3x缓冲区大于bash dd?

时间:2017-01-07 20:26:25

标签: python bash python-3.x

我想将一个大文件(> = 1GB)复制到内存中:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from subprocess import check_output
from shlex import split

zeroes = open('/dev/zero')

SCALE = 1024

B = 1
KB = B * SCALE
MB = KB * SCALE
GB = MB * SCALE

def ck(str):
    print('{}:\n{}\n'.format(str, check_output(split('free -m')).decode()))

ck('## Before')

buffer = zeroes.read(GB)

ck('## After')  

输出:

## Before:
              total        used        free      shared  buff/cache   available
Mem:          15953        7080        6684         142        2188        8403
Swap:          2047           0        2047


## After:
              total        used        free      shared  buff/cache   available
Mem:          15953        9132        4632         142        2188        6351
Swap:          2047           0        2047

显然6684 - 4632 = 2052 MB(几乎是预期1 GB的2倍)。

dd测试显示预期结果:

# mkdir -p /mnt/tmpfs/
# mount -t tmpfs -o size=1000G tmpfs /mnt/tmpfs/
# free -m 
              total        used        free      shared  buff/cache   available
Mem:          15953        7231        6528         144        2192        8249
Swap:          2047           0        2047
# dd if=/dev/zero of=/mnt/tmpfs/big_file bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.695143 s, 1.5 GB/s
# free -m 
              total        used        free      shared  buff/cache   available
Mem:          15953        7327        5406        1168        3219        7129
Swap:          2047           0        2047

有什么问题?为什么python的大小是2倍?

Python 3x中复制所需输出 *的最佳做法是什么?

*所需输出 - python使用与dd相同的内存量。

1 个答案:

答案 0 :(得分:1)

请参阅How is unicode represented internally in Python?

因为您没有指定您的文件是二进制文件,所以您正在读取unicode字符,每个字符需要2-4个字节才能存储在内存中,即使对于表示为磁盘上单个字节的代码点也是如此。 / p>

使用:

zeroes = open('/dev/zero', 'rb') # the 'b' flag is critical here!

...打开文件以读取字节串。