0

以下のご協力をよろしくお願いいたします。

デュアルブートラップトップ(-Ubuntu 12.04 LTS、64ビットおよびMS Windows 7 64ビット)でPythonコード(Ipython、Pythonバージョン2.7.3を使用)を実行しようとしています。Windowsでコードを実行すると正常に動作しますが、何らかの理由でUbuntuでメモリエラーが発生します。これがPythonの問題なのかOSの問題なのかわかりません。私はMSウィンドウでコードを実行することに固執しますが、Ubuntuでコードを実行するときに持っていないライブラリのインポートなど、私が苦労している独自の問題があります。

コードはかなり単純です。参考までに、ラボの3つのチャネルからの16ビットの符号付き数値を表す大きなバイナリファイルがあります。楽器。データは10MS/秒でサンプリングされました。ファイルは約1.GGバイトで、約25秒のデータを表します。以下のコードでは、データを「data」に読み込み、Matplotlibのスペクトログラム関数を使用してスペクトログラムをプロットしたいと思います。この部分はWindowsでは正常に機能しますが、Ubuntuでは機能しません。

いくつかのコード...

import os
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
file = "data_stream.srm"
with open(file,'rb') as fd:
fd.seek(0)
data = np.fromfile(fd,dtype=[('ch0','<i2'),('ch1','<i2'),('ch2','<i2')]) 

データの内容(生の信号値)は次のようになります。

array([(-1, 5, -3), (-4, 3, -4), (-6, 0, -3), ..., (-1, -2, 0),
   (-2, -1, -2), (-2, -2, -1)], 
  dtype=[('ch0', '<i2'), ('ch1', '<i2'), ('ch2', '<i2')])

おそらくそれを行うための最良の方法ではありませんが、ここまでは正常に機能します(UbuntuとWindowsの両方で)。データのサイズ(data.shapeを使用)は(261144000、)を与えます。この大きな数は、3つのチャネルごとの行数(したがって値の数)であるため、形状が(261144000,3)であることがわかると予想されます。たとえば、次のように入力します。

len(data'ch0']) 

戻る、261144000

次の問題は、matplotlibのスペクトログラム関数を使用したスペクトログラムです。

   specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none,
    window=mlab.window_hanning, noverlap=128,
    cmap=None, xextent=None, pad_to=None, sides='default',
    scale_by_freq=None, **kwargs)

いくつかのコード..。

ADCR = 12        # ADC Resolution in bits
    VOLT = 5.0       # Voltage range
    SF = VOLT/(2**ADCR)  # scaling factor to convert raw ADC values to volts  

    w_length= 512 
    nFFT=2 * w_length
    n_overlap=np.fix(w_length/2)
    p_to = 4 *w_length
    cmap=plt.cm.seismic
    Fs = 10E6 # Sampling Frequency
    fig=plt.figure()
    ax=fig.add_subplot(111)
    Pxx, freqs, bins,im =    


plt.specgram((data['ch1'])*SF,NFFT=nFFT,Fs=Fs,noverlap=n_overlap,pad_to=p_to,cmap=cmap)

この最後のコマンドの実行はWindowsでは機能しますが、Ubuntuでは機能しません。次のメッセージが表示されます。

メモリエラー...「投稿するには10のレピュテーションが必要なため、画像を投稿できません」

MemoryError                               Traceback (most recent call last)
/media/IomegaHDD/<ipython-input-28-5144fe0c6918> in <module>()
----> 1 Pxx, freqs, bins, im = plt.specgram((data['ch1'])*SF,NFFT=nFFT,Fs=Fs,detrend=mlab.detrend_linear,noverlap=n_overlap,pad_to=p_to,scale_by_freq=True,cmap=cmap)

/usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc in specgram(x, NFFT, Fs, Fc, detrend, window, noverlap, cmap, xextent, pad_to, sides, scale_by_freq, hold, **kwargs)
   2609         ax.hold(hold)
   2610     try:
-> 2611         ret = ax.specgram(x, NFFT, Fs, Fc, detrend, window, noverlap, cmap, xextent, pad_to, sides, scale_by_freq, **kwargs)
   2612         draw_if_interactive()
   2613     finally:

/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in specgram(self, x, NFFT, Fs, Fc, detrend, window, noverlap, cmap, xextent, pad_to, sides, scale_by_freq, **kwargs)
   8146 
   8147         Pxx, freqs, bins = mlab.specgram(x, NFFT, Fs, detrend,
-> 8148              window, noverlap, pad_to, sides, scale_by_freq)
   8149 
   8150         Z = 10. * np.log10(Pxx)

/usr/lib/pymodules/python2.7/matplotlib/mlab.pyc in specgram(x, NFFT, Fs, detrend, window, noverlap, pad_to, sides, scale_by_freq)
    458 
    459     Pxx, freqs, t = _spectral_helper(x, x, NFFT, Fs, detrend, window,
--> 460         noverlap, pad_to, sides, scale_by_freq)
    461     Pxx = Pxx.real #Needed since helper implements generically
    462 

/usr/lib/pymodules/python2.7/matplotlib/mlab.pyc in _spectral_helper(x, y, NFFT, Fs, detrend, window, noverlap, pad_to, sides, scale_by_freq)
    256     ind = np.arange(0, len(x) - NFFT + 1, step)
    257     n = len(ind)
--> 258     Pxy = np.zeros((numFreqs, n), np.complex_)
    259 
    260     # do the ffts of the slices


MemoryError: 

私が言ったように、おそらくそれは私が知らないUbuntuの問題であり、Windowsでコードを実行するとこの問題は発生しません。ただし、これには、コードの他の後続部分に関する独自の問題があります。

よろしくお願いします。

ありがとうございました。

よろしく、

意思。

4

1 に答える 1

0

32 ビットの Ubuntu ディストリビューションを実行していてよろしいですか? また、64 ビット版の python も実行している必要があります。

これが問題である場合、32 ビット オペレーティング システム (およびプログラム) は、64 ビット システムで可能な大きなメモリ チャンクをアドレス指定できないという事実が原因です。

64ビットLinuxを使用しているかどうかを確認するには、(Ubuntuで)実行します

$ uname -a

探して

  • x86_64 GNU/Linux-- 64 ビット
  • ia64 GNU/Linux -- 64 ビット
  • i386 GNU/Linux -- 32 ビット

32ビットのpython実行可能ファイルがあるかどうかを確認するには、チェックアウトしてください

$ file -L `which python`

64 秒または 32 秒に注意してください。

于 2013-02-28T17:24:05.173 に答える