2011-06-28 16 views
10

Bir pyodbc.cursor.execute komutundan döndürülen imleç. Bu verileri paketlemenin ve virgülle ayrılmış dizeler listesine yerleştirmenin en hızlı yolu nedir (veya özel bir nesneye dönüştürmek)? Bir podbc sonuç satırından virgülle ayrılmış bir dizeyi nasıl oluşturursunuz?

Şu anda aşağıdaki yapıyorum:

cursor.execute(query_str) 
f = open(out_file, 'w') 
for row in cursor: 
    f.write(','.join([str(s) for s in row])) 
    f.write('\n') 

Bu gülünç pahalı bir operasyon gibi görünüyor satırda, başına 130ms alır. Bunu nasıl hızlandırabilirim?

+1

bana göre ucuz görünüyor. Zaman harcanan zaman nerede? Veritabanı? Ağ? İŞLETİM SİSTEMİ? Gereksinimlerinizde belirtilen zaman çizelgesi nedir? –

+0

Döndürülmüş sorguların kabaca 6000 kaydı vardır. Onları bir dosyaya yazmak Win XP, geç model dell iş istasyonunda (T5500) yaklaşık 5-6 dakika sürer, bu yüzden bir işlemci sınırlaması değildir. zaman birleştirme içinde harcanıyor ([satırda str (s)]), kayıttaki tüm öğeler için str işlevini çağırıyor. Aynı zamanda iade edilen sütunların miktarını da sınırlandırmayı denedim ve 25'ten yaklaşık 15'e düşürdüm, bu aslında biraz daha yavaş. – DonQuixote

+0

Daha az sütun daha yavaşsa, her bir sütunun veri türlerini incelemeniz gerekir. Tüm bu zaman almak ve bu çok çok yavaş yapmak için büyük bir BLOB sütunu alır. Lütfen "optimizasyon" ile zamanınızı harcadan önce verileri toplamaya devam edin. Lütfen bulgularınızı içeren soru ** güncelleyin. Lütfen kendi sorunuzda yorum yapmaktan kaçının. Lütfen ** hepsi ** ile güncelleyin. –

cevap

11

Ben csv modülünü kullanmak:

import csv 

cursor.execute(query_str) 
with open(out_file, 'w') as f: 
    csv.writer(f, quoting=csv.QUOTE_NONE).writerows(cursor) 

dikkat veri alanında bir virgül varsa sen csv.QUOTE_NONE bir csv.Error yükseltilir eğer. Aklı başında en az csv.QUOTE_MINIMAL olacaktır. Satır başına 130ms

+0

+1. Ayrıca [quotechar'i boş bir dizgeye ayarlamanıza yardımcı olur] (http://stackoverflow.com/a/23296450/753731) – iruvar

İlgili konular