Самый эффективный способ памяти - это читать байты байта входного файла и записывать этот байт в другие файлы по очереди:
with open(sys.argv[1], 'rb') as yuv, \
open('uv_buffer', 'wb') as uv, open('y_buffer', 'wb') as y:
while True:
b = yuv.read(2)
if not b:
break
uv.write(b[:1])
v.write(b[1:])
При этом в памяти сохраняется только два байта одновременно, по сравнениючтобы вы прочитали весь файл в память. Вы можете читать более крупные порции за раз (скажем, 1024
или 1024 * 1024
) и распределять их по двум файлам оттуда, в зависимости от предпочтительного компромисса между CPU / IO и оптимизацией памяти:
with open(sys.argv[1], 'rb') as yuv, \
open('uv_buffer', 'wb') as uv, open('y_buffer', 'wb') as y:
while True:
b = yuv.read(1024)
if not b:
break
uv.write(b[::2])
y.write(b[1::2])