2013-04-17 3 views
2

Мне нужно прочитать файл размером 2.5gb. Я использую следующий syntx:Эффективное управление памятью и обработкой python

import numpy as np 
limit=4269*352*288*3 
mat1=np.zeros(limit, dtype='uint8') 
mat1=np.fromfile("path/to/file", "uint8", limit) 

я теперь нужно изменить этот массив:

mat_new=np.zeros([4269, 288, 352, 3], dtype='uint8') 
mat_new=np.transpose(np.reshape(mat1,[4269,3,288,352]), [0,2,3,1]) 

Это занимает около 35 секунд на моем 4gb оперативной памяти, i7 системы второго поколения. В любом случае я мог бы сделать это быстрее. Поскольку это только начало моей программы и более сложные вещи, чтобы идти вперед. Мне не нужно mat1 отныне!

Также я читаю только половину файла для начала, поскольку Python дает мне ошибку «максимальная память достигнута».

+4

Сначала вам не нужно создавать нулевой массив, вы можете удалить строки 'np.zeros()'. чтение данных из файла происходит медленно, профилируйте свой код, чтобы определить затраты времени на «np.fromfile()». – HYRY

+0

занимает около 18 секунд, чтобы читать 1,25 ГБ данных! и 12-14 секунд, чтобы изменить форму! – change

ответ

1

она занимает около 18 секунд для чтения данных 1,25 Гбят

Речь идет о 70Мбах/с, т.е. скорость, вероятно, ограничена вашим диском производительности ввод/вывод.

Если вам не нужен весь файл; вы могли бы использовать numpy.memmap:

mat = np.memmap("path/to/file", shape=(4269,288,352,3)) 

Чтобы избежать ошибок памяти, используйте INPLACE операции т.д .:

mat_new = mat1.transpose(0,2,3,1) # no data copying 

Кроме того, как @HYRY said, удалить ненужные np.zeros().

Смежные вопросы