Ich habe derzeit eine Python-Anwendung, wo Newline-terminierte ASCII-Zeichenfolgen über einen TCP/IP-Socket an mich übertragen werden. Ich habe eine hohe Datenrate dieser Zeichenfolgen, und ich muss sie so schnell wie möglich analysieren. Derzeit werden die Zeichenketten als CSV übertragen, und wenn die Datenrate hoch genug ist, beginnt meine Python-Anwendung hinter der Eingabedatenrate zurückzubleiben (was wahrscheinlich nicht sonderlich überraschend ist).
Die Strings sehen in etwa so aus:
chan,2007-07-13T23:24:40.143,0,0188878425-079,0,0,True,S-4001,UNSIGNED_INT,name1,module1,...
Ich habe ein entsprechendes Objekt, das diese Zeichenketten analysiert und alle Daten in einem Objekt speichert. Derzeit sieht das Objekt etwa so aus:
class ChanVal(object):
def __init__(self, csvString=None,**kwargs):
if csvString is not None:
self.parseFromCsv(csvString)
for key in kwargs:
setattr(self,key,kwargs[key])
def parseFromCsv(self, csvString):
lst = csvString.split(',')
self.eventTime=lst[1]
self.eventTimeExact=long(lst[2])
self.other_clock=lst[3]
...
Um die Daten aus dem Socket zu lesen, verwende ich ein einfaches "socket.socket(socket.AF_INET,socket.SOCK_STREAM)" (meine App ist der Server-Socket) und dann verwende ich das "select.poll()"-Objekt aus dem "select"-Modul, um den Socket mit seiner "poll(...)"-Methode ständig nach neuen Eingaben zu fragen.
Ich habe eine gewisse Kontrolle über den Prozess, der die Daten sendet (d.h. ich kann den Absender dazu bringen, das Format zu ändern), aber es wäre wirklich praktisch, wenn wir die ASCII-Verarbeitung so weit beschleunigen könnten, dass wir keine Festbreiten- oder Binärformate für die Daten verwenden müssten.
Bis jetzt habe ich also folgende Dinge ausprobiert, die nicht wirklich einen Unterschied gemacht haben:
- Mit der String-"Split"-Methode und dann Indizierung der Liste der Ergebnisse direkt (siehe oben), aber "Split" scheint wirklich langsam zu sein.
- Verwendung des "reader"-Objekts im "csv"-Modul zum Parsen der Zeichenketten
- Ändern der gesendeten Strings in ein String-Format, das ich zur direkten Instanziierung eines Objekts über "eval" verwenden kann (z. B. Senden von etwas wie "ChanVal(eventTime='2007-07-13T23:24:40.143',eventTimeExact=0,...)")
Ich versuche, ein Format mit fester Breite oder ein binäres Format zu vermeiden, obwohl mir klar ist, dass diese Formate letztendlich wahrscheinlich viel schneller wären.
Letztendlich bin ich offen für Vorschläge, wie man den Socket besser abfragen kann, wie man die Daten besser formatieren/parsen kann (obwohl wir hoffentlich bei ASCII bleiben können) oder alles andere, was Ihnen einfällt.
Gracias.