作者andy6756 (阿岳)
看板Python
標題[問題] 如何優化python讀檔速度
時間Mon Jan 2 21:31:06 2012
*環境:*
Python2.6 + Django1.2.5 + MySql + DotCloud
*前置作業:*
現在有幾千個文件檔
每個文件裡約有200-400筆資料
(文件範例共2個檔案)
1.txt為1筆資料,
內容:
8.44587 6.42955 1.59212 0.225454 4 3 0 0 1 0 0 0 28 82 29 9 1 0 0 0 1 23 42
67 39 0 0 0 0 0 0 2 4 0 0 0 51 21 0 0 2 4 0 2 162 162 28 34 26 2 1 32 29 52
35 162 162 14 1 7 0 0 0 11 43 1 0 0 47 24 9 0 0 0 0 13 162 40 4 4 24 14 16
162 35 4 1 48 162 85 28 80 0 0 0 18 58 5 0 0 2 17 8 0 0 1 3 0 40 13 3 0 1 5
35 71 8 0 0 4 44 55 40 38 0 0 0 3 9 5 0 0
2.txt為2筆資料
內容:
8.44587 6.42955 1.59212 0.225454 4 3 0 0 1 0 0 0 28 82 29 9 1 0 0 0 1 23 42
67 39 0 0 0 0 0 0 2 4 0 0 0 51 21 0 0 2 4 0 2 162 162 28 34 26 2 1 32 29 52
35 162 162 14 1 7 0 0 0 11 43 1 0 0 47 24 9 0 0 0 0 13 162 40 4 4 24 14 16
162 35 4 1 48 162 85 28 80 0 0 0 18 58 5 0 0 2 17 8 0 0 1 3 0 40 13 3 0 1 5
35 71 8 0 0 4 44 55 40 38 0 0 0 3 9 5 0 0
8.44587 6.42955 1.59212 3.26753 7 3 0 0 0 0 0 3 51 62 33 28 7 0 0 4 2 8 35 75
43 8 2 0 0 1 6 1 2 13 9 0 52 7 0 0 0 0 0 11 163 119 24 59 37 5 1 31 27 21 19
163 163 46 5 3 0 0 0 10 47 28 16 0 52 2 0 0 0 0 0 8 163 21 1 6 29 70 42 137
24 3 1 29 163 163 27 24 1 4 0 2 45 24 0 0 7 0 0 0 0 0 0 3 37 0 0 0 2 29 47 61
1 0 0 0 24 88 25 5 1 2 0 0 2 3 0 0
########################################################
*目的:*
把文件裡的每筆資料先用固定格式,
再用record_query_vector包成一個list
(請先不要提psyco和pypy、multithread及mysql的LOAD DATA INFILE,是否能從程式去改)
*問題:*
我目前程式是這樣,主要耗的速度是讀檔的時間,
光是讀幾百個檔( 迴圈次數多 ),就要花將近40秒的時間,
請問該怎麼改?讓速度更快呢?
請指點一下或者麻煩改程式碼,麻煩了,謝謝您。
*變數: *
全部文件檔=all_f=[ ]
try與finally包成的程式是文件資料要轉成的格式
for ts in TData.objects.raw(*'SELECT id,* f_url *FROM ts_to'*):
all_f.append(ts.f_url)
第幾個文件檔的連結=f_url
record_query_vector=[ ]
*
*
*程式:*
for f_url in all_f:
test_dict={ }#字典
file=open(f_url)
next(file)
try:
for line in file:
dk=line.split()[:4]#串列,字典的key
dk=' '.join(dk)#字串
dv=line.split()[4:]#串列,字典的value
dv=' '.join(dv)#串列包字串
dv= [int(n) for n in dv.split(' ')]
test_dict[str(dk)]=dv
count+=1
finally:
file.close()
record_query_vector.append(test_dict.values())
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.121.165.146
→ suzuke:最後test_dict.values()不就只有取dv? 那為什麼一開始還要 01/02 22:32
→ suzuke:把dk,dv用test_dict包在一起? 01/02 22:32
→ andy6756:我是為了程式看起來不要太冗長,其實後面還是有用到的。 01/03 00:01
→ suzuke:dv= [int(n) for n in dv.split(' ')] 也許可以改成 01/03 01:22
→ suzuke:dv = map(int,dv.split(' ')), 不過這裡蠻奇怪的是' '.join 01/03 01:23
→ suzuke:之後又用split(' ')分開是有什麼用意嗎?? 01/03 01:23
推 Falldog:IO花太多時間了 檔案小的話 整個檔一次讀進memory裡 01/03 08:18
→ Falldog:for line in file.readlines(): ... 01/03 08:19
→ andy6756:抱歉,我給的小範例給錯了,現在改回來。 01/03 09:49
※ 編輯: andy6756 來自: 59.121.160.126 (01/03 09:52)
→ chigi:換SSD? 01/07 00:54
→ chigi:(遮臉 01/07 00:55