2016-05-19 3 views
1

Я читаю данные из файлов матов 20k в массив. После чтения около 13k файлов процесс завершается сообщением «Killed». Похоже, проблема в том, что слишком много файлов открыто. Я попытался выяснить, как явно закрывать файлы матов в Python, но не нашел ничего, кроме savemat, который в этом случае не нужен.Python: как закрыть файл мата?

Как я могу явно закрыть файлы матов в python?

import scipy.io 
x=[] 
with open('mat_list.txt','r') as f: 
    for l in f: 
      l=l.replace('\n','') 
      mat = scipy.io.loadmat(l) 
      x.append(mat['data']) 

ответ

1

Вы можете передать открытый дескриптор файла scipy.io.loadmat:

import scipy.io 
x=[] 

with open('mat_list.txt','r') as f: 
    for l in f: 
     l=l.replace('\n','') 
     with open(l, 'r') as matfile: 
      mat = scipy.io.loadmat(matfile) 
     x.append(mat['data']) 

with open() оставляя контекст будет автоматически закрывать файл.

+0

не работает, то же сообщение "Killed" около 13k – ytrewq

+0

Сколько данных вы читаете? Возможно, это проблема с исчерпанием памяти + смены. Вы проверили 'top'? Вы также можете использовать 'lsof' для проверки файлов, которые в данный момент открыт. Вы должны видеть только несколько файлов. –

+0

каждый мат ['data'] - массив 10x4096 of float32 – ytrewq

1

Вам не нужно. loadmat не сохраняет файл открытым. Если задано имя файла, он загружает содержимое файла в память, а затем немедленно закрывает его. Вы можете использовать файл-объект, такой как @ nils-werner, но вы не получите никакой пользы от этого. Вы можете видеть это, глядя на source code.

Скорее всего, вы исчерпаете память из-за простого количества данных за раз. Первое, что я хотел бы попробовать, - загрузить все данные в один большой массив numpy. Вы знаете размер каждого файла, и знаете, сколько у него файлов, поэтому вы можете предварительно выделить массив нужного размера и записать данные на срезы этого массива. Это также сразу скажет вам, если это проблема с размером вашего массива.

Если у вас все еще не хватает памяти, вам понадобится другое решение. Простым решением было бы использовать dask. Это позволяет создавать что-то, что выглядит и действует как массив numpy, но живет в файле, а не в памяти. Это позволяет работать с слишком большими наборами данных, чтобы вписаться в память. bcolz и blaze предлагают аналогичные возможности, хотя и не так легко.

Если это не вариант, h5py и pytables позволяют вам хранить наборы данных в файлах поэтапно, а не хранить все это в памяти сразу.

В целом, я думаю, что этот вопрос является классическим примером XY Problem. Как правило, гораздо лучше указывать свои симптомы и просить о помощи по этим симптомам, а не гадать, что такое решение, и просить кого-то помочь вам реализовать решение.

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