From: Maxious Date: Sun, 30 Sep 2012 11:32:12 +0000 Subject: Try to reduce runaway memory usaqe X-Git-Url: https://maxious.lambdacomplex.org/git/?p=scannr.git&a=commitdiff&h=3e3022b1850a9d246f322025bc0c13c02c4a5e6b --- Try to reduce runaway memory usaqe --- --- /dev/null +++ b/.gitmodules @@ -1,1 +1,4 @@ +[submodule "pynma"] + path = pynma + url = git://github.com/uskr/pynma.git --- /dev/null +++ b/README.txt @@ -1,1 +1,1 @@ - +ffmpeg from http://ffmpeg.zeranoe.com/builds/ --- /dev/null +++ b/pynma --- /dev/null +++ b/run.bat @@ -1,1 +1,1 @@ - +python scannr.py > output.txt --- a/scannr.py +++ b/scannr.py @@ -1,32 +1,92 @@ +import logging +logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s\t%(levelname)s\t%(message)s') + import snd import time from datetime import date import threading +from pydispatch import dispatcher +import wave +import serial +#python -m serial.tools.miniterm -p COM20 -e -b 115200 --cr +import psycopg2 +import csv +import sys,os -filename = "" -def worker(filename): + +sys.path.insert(0, os.path.join(os.path.dirname(__file__) or '.', 'pynma')) +import pynma + +filename = "demo.wav" +MIN_LENGTH = 90000 + + +def worker(filename, length): + """thread worker function http://www.doughellmann.com/PyMOTW/threading/ + https://github.com/uskr/pynma +ffmpeg -i 2012-09-29-1348911268.34-demo.wav -ar 8000 -ab 4.75k test.3gp +http://stackoverflow.com/questions/2559746/getting-error-while-converting-wav-to-amr-using-ffmpeg +""" + print 'Worker for '+filename + ser.write("GLG\r") + line = ser.readline() # read a '\n' terminated line + print line + reader = csv.reader([line]) + for row in reader: + #GLG,40078,NFM,0,0,CanberraBlackMnt,AustralianCapita,SES Ops 1,1,0,NONE,NONE,NONE + if (row[0] != 'GLG'): + print "uh oh" + if (row[1] != ''): + tgid = row[1] + #nma.push("scannr", "ping", filename, "http://www.google.com") + tgname = row[7] + sitename = row[5] + """http://initd.org/psycopg/docs/usage.html""" + cur = conn.cursor() + cur.execute("INSERT INTO recordings (filename,tgid,tgname,sitename,length) VALUES (%s, %s,%s, %s, %s)",(filename,tgid,tgname,sitename, length)) + conn.commit() + cur.close() + else: + print filename+" has no TGID" - https://github.com/uskr/pynma""" - print 'Worker for '+filename return def filenameMaker(): global filename - while True: - filename = date.today().isoformat()+'-'+str(time.time())+'-demo.wav' - time.sleep(5) + filename = date.today().isoformat()+'-'+str(time.time())+'-demo.wav' +def record_to_async_file(): + "Records from the microphone and outputs the resulting data to `path`" + sample_width, data = snd.record() + print str(len(data)) + if len(data) > MIN_LENGTH: + data = snd.pack('<' + ('h'*len(data)), *data) + path = filename + dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename, length=len(data)) + wf = wave.open(path, 'wb') + wf.setnchannels(1) + wf.setsampwidth(sample_width) + wf.setframerate(snd.RATE) + wf.writeframes(data) + wf.close() + del wf + print("done - result "+str(len(data))+" frames written to "+path) + del data +dispatcher.connect( filenameMaker, signal='SND_STARTED', sender=dispatcher.Any ) +dispatcher.connect( worker, signal='FILE_CREATED', sender=dispatcher.Any ) -threads = [] -fm = threading.Thread(target=filenameMaker) -fm.daemon = True -fm.start() -print "Scannr started..." +print "Opening serial port..." +ser = serial.Serial('COM20', 112500, timeout=1) +print "Loading notifymyandroid..." +nma = pynma.PyNMA( "a6f50f76119eda33befe4325b4b9e1dd25eef7bad2868e4f") +print "Connecting database..." +conn = psycopg2.connect("dbname=scannr user=postgres password=snmc") +print "Scannr started." while True: - print "ready to record" - snd.record_to_file(filename) - t = threading.Thread(target=worker,args=(filename,)) - t.start() + print "ready to record again" + record_to_async_file() +ser.close() --- a/snd.py +++ b/snd.py @@ -10,12 +10,14 @@ from array import array from struct import unpack, pack import threading +from pydispatch import dispatcher CHANNELS = 1 THRESHOLD = 500 CHUNK_SIZE = 1024 FORMAT = pyaudio.paInt16 RATE = 44100 +MAX_SILENT = 30 def is_silent(L): "Returns `True` if below the 'silent' threshold" @@ -88,7 +90,6 @@ data = stream.read(CHUNK_SIZE) L = unpack('<' + ('h'*(len(data)/2)), data) # little endian, signed short L = array('h', L) - LRtn.extend(L) silent = is_silent(L) #print silent, num_silent, L[:10] @@ -97,9 +98,12 @@ num_silent += 1 print num_silent elif not silent and not snd_started: + dispatcher.send( signal='SND_STARTED') snd_started = True print snd_started - if snd_started and num_silent > 30: + if snd_started: + LRtn.extend(L) + if snd_started and num_silent > MAX_SILENT: break sample_width = p.get_sample_size(FORMAT) @@ -124,6 +128,7 @@ wf.writeframes(data) wf.close() print("done - result written to "+path) + del data --- /dev/null +++ b/trunklog.php @@ -1,1 +1,31 @@ - +"; +if (($handle = fopen("C:\Users\Madoka\AppData\Roaming\UniTrunker\S00000001\UniTrunker-20120411.LOG", "r")) !== FALSE) { + while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { + + if ($row > 0 && count($data) == 9) { + + echo ""; + for ($c=0; $c < count($data); $c++) { + echo ''.$data[$c] . "\n"; + } + echo ""; + } + $row++; + } + fclose($handle); +} +echo ""; +?>