在Mac上使用Python释放对象后,该对象可能已被修改

时间:2018-07-19 01:20:29

标签: python numpy malloc sparse-matrix matrix-multiplication

我在函数中有以下代码:

phi = fourier_matrix(y, fs)
N = np.size(phi,axis=1)
x = np.ones(N)

for i in range(136):
    W_pk = np.diag(x)
    temp = pinv(np.dot(phi, W_pk))
    q_k = np.dot(temp, y)
    x = np.dot(W_pk, q_k)

其中phi是(96,750),W_pk是(750,750),q_k是(750,)。

这将引发以下错误:

  

Python(12001,0x7fff99d8b380)malloc: *对象0x7fc71aa37200的错误:释放的对象的校验和不正确-释放后可能已修改了对象。   * 在malloc_error_break中设置一个断点进行调试

如果我评论最后一个点积,则不会出现错误。

我认为我需要以某种方式释放内存,或者以不同的方式做点积?

此外,仅当我从Mac运行它时,才会发生这种情况。在Windows或Linux上,它不会引发错误。

Python是3.6(尝试使用3.7),numpy是1.14.5,也尝试使用1.15

任何帮助将不胜感激,因为我确实需要完成这项工作!

谢谢。


编辑我: 我在jupyter笔记本上尝试了这部分代码,但没有失败。这让我更加困惑!当我在Mac上的Visual Studio Code中运行它时,它将失败。我的其余代码(一种从信号中去除伪像的算法)将按预期工作,直到我添加最后一段代码 x = np.dot(W_pk,q_k)。也许它可以在jupyter上运行,因为我不在那儿运行算法的其余部分?但正如我所说,它只会在最后一个点产品上崩溃。


编辑II:我在此问题的for循环上方添加了一段代码,因为我发现该问题与x的使用方式有关。您会看到它在上面被声明为float64 ndarray。当它到达for循环的最后一行时,点积将返回complex128(应该是complex64,不知道那里发生了什么)并覆盖x数组。第一次可以,但是第二次尝试覆盖时会崩溃。如果我对点积使用新变量,例如z,则不会崩溃!不知道为什么...但是我需要在每次迭代中覆盖x。

此外,如果我做这样的事情:

z = np.dot(W_pk, q_k)
x = abs(z) #I don't need complex numbers at this point

然后,它在第一个点乘积上崩溃并出现相同的错误(大概是这样):

temp = pinv(np.dot(phi, W_pk))

此外,内存消耗还算不错,根据一些测量,大约为110M,并且在iPython上,相同的算法不会导致内存使用率翻倍。这是我最不清楚的地方,为什么它不会在iPython上崩溃?

0 个答案:

没有答案