2009-08-13 9 views
1

ich eine Datei wich muss hinzufügen, etwa 12 millon Linien hat, sieht jede Zeile wie folgt aus:Schnelle Weg Linie/Zeilennummer Textdatei

0701648016480002020000002030300000200907242058CRLF

Was ich versuche zu bewerkstelligen ist das Hinzufügen einer Reihe Zahlen vor den Daten, die Zahlen sollten eine feste Länge haben.

Die Idee hinter dieser ist in der Lage, eine Masseneinfügung dieser Datei in eine SQLServer-Tabelle, und führen Sie dann bestimmte Operationen mit ihm, die jede Zeile mit einer eindeutigen Kennung erfordern. Ich habe versucht, dies auf der Datenbank Seite zu tun, aber ich war nicht in der Lage, eine gute Leistung zu erreichen (unter 4 'mindestens, und unter 1' wäre ideal).

Im Moment versuche ich eine Lösung in Python, die in etwa so aussieht.

file=open('file.cas', 'r') 
lines=file.readlines() 
file.close() 
text = ['%d %s' % (i, line) for i, line in enumerate(lines)] 
output = open("output.cas","w") 
output.writelines(str("".join(text))) 
output.close() 

Ich weiß nicht, ob dies funktionieren wird, aber es wird mir helfen, eine Idee, wie wird sie durchführen und Nebenwirkungen, bevor ich versuchen, neue Dinge zu halten, auch dachte, dass ich es in C tun so Ich habe eine bessere Speicherkontrolle.

Wird es helfen, es in einer niedrigen Sprache zu tun? Kennt jemand einen besseren Weg dies zu tun, bin ich mir ziemlich sicher, dass es getan wurde, aber ich habe nichts gefunden.

dank

+0

haben Sie versucht, einen kleinen Teil der Daten (vielleicht 100 Zeilen) zu nehmen und es in eine temporäre Datei zu kopieren und Ihre Lösung darauf zu testen? – Jason

+0

Probieren Sie es zuerst auf einer kleineren Probe .cas-Datei aus. Verschwenden Sie keine Zeit damit, 12 Millionen Zeilen wieder und wieder zu kopieren. – mcandre

+0

Hat jede Zeile eine feste Größe? Wenn ja, mappen Sie einfach die Datei und setzen Sie Ihre Position auf einen berechneten Offset – hova

Antwort

4

oh Gott nein, nicht lesen auf einmal alle 12 Millionen Zeilen an! Wenn Sie Python gehen zu verwenden, zumindest tut es auf diese Weise:

file = open('file.cas', 'r') 
try: 
    output = open('output.cas', 'w') 
    try: 
     output.writelines('%d %s' % tpl for tpl in enumerate(file)) 
    finally: 
     output.close() 
finally: 
    file.close() 

, die einen Generator Ausdruck verwendet, die zu einem Zeitpunkt die Dateiverarbeitung einer Zeile durchlaufen.

+0

haha ​​danke. Gibt es eine Möglichkeit, eine Datei in Python nach Teilen zu lesen, oder in einer niedrigeren Ebene zu arbeiten? So dachte ich darüber nach, es in C. Dank –

+0

Davids Methode liest die Datei nach Teilen - es liest und schreibt eine Zeile zu einer Zeit. –

+0

Ja, Andy hat Recht - obwohl die Tatsache, dass es eine Zeile nach der anderen liest, in Python Voodoo tief verkleidet ist ;-) Oder zumindest sieht es wie Voodoo aus, wenn man nicht daran gewöhnt ist. –

2

Warum versuchst du nicht Cat -n?

+0

Ich werde es definitiv versuchen, aber für den Moment kann ich nicht Katze verwenden. –

+0

ok, dann ist die Lösung, die David vorschlägt, gut, wenn auch plafayette darauf hinweist, dass es langsamer als Katze sein könnte. –

+0

Ich mache nur ein paar Tests mit einem kleineren Sample (2M Datensätze) und beide Lösungen (Ihr und David's) und beide nehmen die genaue Zeit zu laufen. Morgen werde ich testen, was mit 12M passiert, aber ich erwarte keinen großen Unterschied. danke –

2

Stefano hat Recht:

$ time cat -n file.cas> output.cas

Verwenden Zeit nur so können Sie sehen, wie schnell es ist. Es wird schneller als Python sein, da cat reiner C-Code ist.