Мне нужно создать массив с большим количеством, содержащий случайные логические значения без попадания в swap.
Мой ноутбук имеет 8 ГБ оперативной памяти. Создание массива (1200, 2e6)
занимает менее 2 с и использует 2,29 ГБ оперативной памяти:
>>> dd = np.ones((1200, int(2e6)), dtype=bool)
>>> dd.nbytes/1024./1024
2288.818359375
>>> dd.shape
(1200, 2000000)
Для относительно небольшого (1200, 400e3)
, np.random.randint
все еще довольно быстро, беря приблизительно 5 секунд для создания массива 458 МБ:
db = np.array(np.random.randint(2, size=(int(400e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'
Но если я удвою размер массива до (1200, 800e3)
, я попал в swap, и для создания db
требуется ~ 2,7 мин. (
cmd = """
import numpy as np
db = np.array(np.random.randint(2, size=(int(800e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'"""
print timeit.Timer(cmd).timeit(1)
Использование random.getrandbits
занимает еще больше времени (~ 8min), а также использует swap:
from random import getrandbits
db = np.array([not getrandbits(1) for x in xrange(int(1200*800e3))], dtype=bool)
Использование np.random.randint
для a (1200, 2e6)
просто дает MemoryError
.
Существует ли более эффективный способ создания случайного логического массива (1200, 2e6)
?