我想将一个大文件(> = 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
相同的内存量。
答案 0 :(得分:1)
请参阅How is unicode represented internally in Python?。
因为您没有指定您的文件是二进制文件,所以您正在读取unicode字符,每个字符需要2-4个字节才能存储在内存中,即使对于表示为磁盘上单个字节的代码点也是如此。 / p>
使用:
zeroes = open('/dev/zero', 'rb') # the 'b' flag is critical here!
...打开文件以读取字节串。