3

少し大容量のデータを処理するプログラムを書きました。そこには 3 つのステップが含まれます。

  1. データの読み取り
  2. 処理を行う
  3. データをファイルに書き込みます。

コードを実行している間、最初の 2 つのステップは正常に完了しました。

3 番目のステップ: データがファイルに正常に書き込まれます。しかし、私のコードはその行で動かなくなりfeat.close()ます (feat はファイル ポインターです)。プロセスの実行中にファイルを開くと、完全なデータが書き込まれますが、ファイルが閉じません。

コード:

#!/usr/bin/env python

from __future__ import print_function
import pickle
import sys
import numpy as np
import posTagsToTriGramFrequency as pt
import itertools
import gc

if sys.argv[1] == '-h':
    print("Usage: ./featureSelection <n(authorLimit)> <k(SD weight)> <nGramSize> <folder>")
    sys.exit()

n = int(sys.argv[1])
k = int(sys.argv[2])
nGramSize = int(sys.argv[3])
folder = sys.argv[4]

print('reading features')
feat = open('../../../../dataDump/'+ folder +'/features.dump','r')
features = {}

tagsnGram = [tuple(x) for x in itertools.product(pt.getTags(), repeat=nGramSize)]

gramdict = {}
for gram in tagsnGram:
    gramdict[gram] = []

flag = 1
author = ''
for line in feat:
    if(line == '\n'):
        flag = 1
    elif flag == 1:
        author = line.split('/')[-1][:-1]
        print(line, end='')
        features[author] = gramdict.copy()
        flag = 0
    else:
        tagsFreq = iter(line.split())
        for tag in tagsnGram:
            features[author][tag].append(float(tagsFreq.next()))

feat.close()

print('Calculating waht to delete')

nflag = 0
kflag = 0
toDel = []
for tagGram in tagsnGram:
    nflag = 0
    for author in features:
        kflag = 0
        for doc in features[author][tagGram]:
            if doc == 0 : kflag += 1
            if kflag >= k:
                nflag += 1
                break
        if nflag >= n:
            toDel.append(tagGram)
            break

for item in toDel:
    for author in features:
        del features[author][item]

f = open('../../../../dataDump/'+ folder +'/tagsInfo.dump','w')
f.write('k:' + str(k) + ',\t n:' + str(n) + '\n')
f.write('Deleted tags:\n')
for item in toDel:
    f.write(str(item) + ' ')
f.write('\n\nSelected Tags:\n')
for tagGram in features.itervalues().next():
        f.write(str(tagGram) + ' ')
f.close()

print("Writing Back Features")
feat = open('../../../../dataDump/'+ folder +'/selectedFeatures.dump','w')
for author in features.keys():
    feat.write(author + '\n')
    print(author)
    for tag in features[author]:
        for doc in features[author][tag]:
            feat.write(str(doc) + ' ')
        feat.write('\n')
    feat.write('\n')
    del features[author]
    #gc.collect()
print('Closing File')
feat.close()

最後の行を参照してください。コンソールClosing fileで印刷されていますが、その後コードが動かなくなります。

私のコンソール出力:

abhi@abhi-me~/Projects/workspace/irProject/completepythonbased/authAttrib (irProject)>>./featureSelection.py 35 125 3 3GramFreq
reading features
Ajit_Popat
Mukund_Mehta
Parajit_Patel
Priyadarshi
Kumarpad_Desai
Bhaven_Kacchi
Shantibhai_Agrawat
Pravin_Darji
Ankit_Trivedi
Sharad_Rawal
Tushar_Shukla
Chandrakant_Mehta
Jay_Vasavda
Dolat_Bhatt
Munindra
Mrugesh_Vaishnav
Kulinchandra_Yagnik
Zaverilal_Mehta
Priti_Shah
Vasant_Mistri
Vatsal_Vasani
Dinesh_Mistri
Devesh_Mehta
Dhaval_Mehta
Urvish_Kothari
Madhusudan_Parekh
Vihari_Chaya
Virendra_Kapoor
Mukul_Choksi
Joravarsinh_Jadav
Ashok_Dave
Nasir_Ismaeli
Joban_Pandit
Priyakant_Parikh
Sudarshan_Upadhyay
Gajendra_Shah
Altaf_Patel
Bhalchandra_Jani
Shashin
Hansal_Bhachech
Calculating waht to delete
Writing Back Features
Pravin_Darji
Ajit_Popat
Kulinchandra_Yagnik
Sharad_Rawal
Madhusudan_Parekh
Shantibhai_Agrawat
Gajendra_Shah
Hansal_Bhachech
Vihari_Chaya
Virendra_Kapoor
Sudarshan_Upadhyay
Priyadarshi
Tushar_Shukla
Dolat_Bhatt
Urvish_Kothari
Vasant_Mistri
Mukund_Mehta
Zaverilal_Mehta
Kumarpad_Desai
Vatsal_Vasani
Bhaven_Kacchi
Mrugesh_Vaishnav
Bhalchandra_Jani
Priyakant_Parikh
Chandrakant_Mehta
Mukul_Choksi
Joravarsinh_Jadav
Munindra
Joban_Pandit
Devesh_Mehta
Priti_Shah
Ankit_Trivedi
Dinesh_Mistri
Dhaval_Mehta
Ashok_Dave
Nasir_Ismaeli
Parajit_Patel
Jay_Vasavda
Altaf_Patel
Shashin
Closing File
^C
[1]+  Killed                  ./featureSelection.py 35 125 3 3GramFreq

なぜこれが起こっているのですか?

ここで strace を見つけることができます。

編集: 閉じた後に何かを印刷しようとしましたが、印刷中です。プログラムの終了に問題があることを意味します。約 3 GB の RAM と 3 GB のスワップ領域 @Justing を使用しています。このメモリを埋めるのに 10 ~ 20 分かかり、このメモリをクリアするのに約 2 時間かかりました。問題があると思います。 上記の strace をアップロードしました。ご覧ください。

4

1 に答える 1