2013-04-20 2 views
2

저는 약간의 처리를하기 위해 많은 양의 데이터를 처리하는 프로그램을 작성했습니다. 세 가지 단계가 포함됩니다파이썬 파일이 닫히지 않습니다

  1. 데이터 읽기
  2. 마십시오 처리
  3. 쓰기 데이터 파일로.

코드를 처음 실행하는 동안 두 단계가 성공적으로 완료되었습니다 (데이터가 랩톱 구성에 비해 크기 때문에 Linux에서 스왑 공간을 사용하여 작업하고 있습니다).

이제 세 번째 단계 : 데이터가 파일에 성공적으로 기록됩니다. 하지만 내 코드는 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 인쇄되고 있지만 그 후 내 코드가 붙어 있습니다.

내 콘솔 출력 :

[email protected]~/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 here을 찾을 수 있습니다.

편집 : 내가 가까이 후 뭔가를 인쇄 할 시도하고, 인쇄 인 문제가 프로그램을 종료에 의미합니다. 3GB의 RAM과 3GB의 스왑 공간 @Justing을 사용하고 있습니다. 이 기억을 채우기 위해 10-20 분이 걸렸고이 기억을 정리하기 위해 약 2 시간을 기다렸습니다. 문제가 있다고 생각합니다. 위의 strace를 업로드했습니다. 참조하십시오. 당신이 작성 완료되면 디스크에 플래시합니다 with 작업 할

+11

파이썬에서 파일 작업을 할 때, 가장 좋은 방법은 [은'with' 문 (http://www.youtube.com/watch?v=lRaKmobSXF4&lc=abvyzpzCoB4yV2md5OqJQZgXTd00VmErxY868GfWsEo&lch=email&feature=em-를 사용하는 것을 주목할 필요가 comment_received & lcor = 1). –

+1

코드가 잘 보입니다. 파일이 크다면, OS가 디스크에 무엇인가를 플러시하거나, 스왑 안팎으로 페이지를 이동시키기를 기다리는 것일 수도 있습니다. "Closing File"다음에 잠시 기다려 보신 적이 있으십니까? – Aya

+3

무슨 일이 일어나는지 보려면'strace'를 사용하여 프로그램을 실행하십시오. – glglgl

답변

2

봅니다 :

with open('file.txt', 'r') as f: 
    data = f.read() 
f.closed 

는 파이썬 documentation를 참조하십시오. 파일을 쓰고 읽을 때 대부분의 문제를 해결해야합니다.