Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何关闭mat文件?_Python_Matlab_Python 2.7 - Fatal编程技术网

Python:如何关闭mat文件?

Python:如何关闭mat文件?,python,matlab,python-2.7,Python,Matlab,Python 2.7,我正在将20k mat文件中的数据读取到一个数组中。 在读取了大约13k个文件后,进程以“Killed”消息结束。 显然,问题似乎在于打开的文件太多。 我试图找出如何在Python中显式地“关闭”mat文件,但除了savemat之外,没有找到其他文件,在本例中,这不是我所需要的 如何在python中显式关闭mat文件 import scipy.io x=[] with open('mat_list.txt','r') as f: for l in f: l=l.r

我正在将20k mat文件中的数据读取到一个数组中。 在读取了大约13k个文件后,进程以“Killed”消息结束。 显然,问题似乎在于打开的文件太多。 我试图找出如何在Python中显式地“关闭”mat文件,但除了savemat之外,没有找到其他文件,在本例中,这不是我所需要的

如何在python中显式关闭mat文件

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'])

您可以将打开的文件句柄传递给
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'])

保留为open()
上下文将自动关闭文件。

您不需要这样做
loadmat
不会使文件保持打开状态。如果给定了文件名,它会将文件内容加载到内存中,然后立即将其关闭。您可以使用像@nils-werner建议的那样的文件对象,但这样做不会带来任何好处。你可以从下面的图片中看到这一点

由于一次有太多数据,很可能内存不足。我要尝试的第一件事是将所有数据加载到一个大的numpy数组中。您知道每个文件的大小,也知道有多少文件,因此可以预先分配一个大小合适的数组,并将数据写入该数组的切片中。这也会立即告诉您这是否是阵列大小的问题

如果内存仍然不足,则需要另一种解决方案。一个简单的解决方案是使用
dask
。这允许您创建一些外观和行为类似于numpy数组的东西,但它们存在于文件中而不是内存中。这允许您处理太大而无法放入内存的数据集
bcolz
blaze
提供了类似的功能,尽管没有那么无缝

如果没有这些选项,
h5py
pytables
允许您以增量方式将数据集存储到文件中,而不必一次将整个内容保存在内存中


总的来说,我认为这个问题是一个典型的例子。通常情况下,最好是陈述你的症状,并就这些症状寻求帮助,而不是猜测解决方案是什么,然后请某人帮助你实施解决方案

你在读多少数据?可能是内存+交换耗尽的问题。您是否已选中顶部?您还可以使用
lsof
检查进程当前打开了哪些文件。您应该只看到少数几个文件。每个mat['data']是一个10x4096 float32数组,总数据量约为3 GB。您有多少RAM?您是否检查过进程监视器的内存消耗情况?