編程小白一個,求大佬指導一下!感激不盡!
我現在有出租車出行gps資料,存盤在25個文本檔案中,每個文本檔案2GB左右,每行是一個快照,格式是這樣的:
1,30.624806,104.136604,1,2014/8/3 21:18:46
從左到右依次是:出租車編號(一共1.2w輛車),當前經度,當前維度,當前是否載客(1為載客0為空載),當前時間
我想做的事是,將這些GPS資料轉化為出租車載客時的行駛軌跡資料,每行一條載客軌跡,像這樣:
1,2014/8/3 21:18:46,30.624806,104.136604,30.702500,104.072532,30.702510,104.072560,30.702534,104.072572
從左到右依次是:此軌跡的出租車編號,軌跡開始時間,之后就是從開始到結束的gps位置記錄
因為文本檔案中只按出租車編號進行了排序,而每個出租車的所有快照沒有按時間順序排序,所以我想的是1.先把快照按出租車編號,時間兩個指標進行多級排序,2.想辦法把排好順序的資料整理成軌跡資料(這個還完全沒有思路)
問題是資料量太大,我的代碼完全跑不動,嘗試了很多辦法都沒用,求大佬指點一下,感激不盡!
# In[1]
import datetime
now_time=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
print('start_time : '+str(now_time))
# In[]
file=r"F:\didi\20140803_train.txt".encode('utf-8').decode('utf-8')
with open(file) as f:
dic = []
for line in f.readlines():
line=line.strip('\n')
dic.append(line.split(","))
now_time=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
print('time_1 : '+str(now_time))
# In[2]
#將時間列分割為日期和時刻
for i in range(0,len(dic)):
dic[i].append(dic[i][4].split(" ")[0])
dic[i].append(dic[i][4].split(" ")[1])
dic[i].remove(dic[i][4])
now_time=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
print('time_2 : '+str(now_time))
# In[3]
#將時刻分為小時分鐘秒三列
for i in range(0,len(dic)):
dic[i].append(dic[i][5].split(":")[0])
dic[i].append(dic[i][5].split(":")[1])
dic[i].append(dic[i][5].split(":")[2])
dic[i].remove(dic[i][5])
now_time=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
print('time_3 : '+str(now_time))
# In[4]
#將出租車,小時,分鐘,秒,日期放在前五列方便排序
for i in range(0,len(dic)):
dic[i]=dic[i][0:1]+dic[i][5:8]+dic[i][3:5]+dic[i][1:3]
dic=sorted(dic)
now_time=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
print('end_time : '+str(now_time))
uj5u.com熱心網友回復:
求助大神
uj5u.com熱心網友回復:
資料庫建立兩個庫,新庫和舊庫第一個庫是舊庫,將文本檔案逐行寫入
從舊庫中提取某一輛車的資料,寫入新庫的一個表里,估計要1.2w個表
祈禱你的文本檔案的內容是按時間排序的
如果不是,新庫資料還需要按照時間排序
然后提取某一輛車的載客狀態是1的坐標,就是你要的
uj5u.com熱心網友回復:
每個文本檔案是特定某一天內1.2w輛出租車的GPS資料,按出租車編號順序排好了,但是每個出租車的GPS資料沒有按照時刻排好順序。
另外按你說的方法是不是還沒有把每次載人的軌跡分開呀?
uj5u.com熱心網友回復:
更簡單了,全部存到資料庫里面,按日期分表
25個表
提取某一天某一輛車的資料,資料量應該不多,
遍歷資料,當載客狀態是1的時候,獲取后面連續是1的資料,遇到0就停下,將這些資料提取出來放到新的txt檔案里,這些資料從原串列洗掉,重新開始遍歷。,直到原串列全是0.
遍歷結束,txt檔案里就有好幾行載客全是1的資料,
uj5u.com熱心網友回復:
單個檔案就有2G,你還敢直接readlines?卡不死你!===============================
你的這個問題,應該分解化:
1.設計資料庫表,先只管怎么分表的問題,比如可以按日期分表
2.逐個文本檔案逐行readline讀取,然后寫入到資料庫對應的表中
3.因為你的這些資料都是歷史資料,所以可以在資料庫層面建立視圖方便今后查詢使用
uj5u.com熱心網友回復:
先把不用的不載客的資料處理掉,這樣會節省不少時間,然后單行讀取吧,每次建立一個車的資料,或用多執行緒試試uj5u.com熱心網友回復:
某一天內某輛車的很多GPS資料記錄不是按時間排的,所以思考了一下把你兩次回答合在一起應該可以得到我想要的,我主要是擔心速度的問題,怕這個要運行二三十天
uj5u.com熱心網友回復:
25g的文本資料,處理邏輯也不復雜,都不需要用到資料庫,按每1000個車映射一個中間文本檔案,所有代碼1小時以內能執行完uj5u.com熱心網友回復:
可以說的具體一些嗎?真的感激不盡!
uj5u.com熱心網友回復:
不要使用readlines函式,這樣會一次性加載到記憶體中。可以這樣for line in open(file, encoding="utf-8"):
# 這里的line即是每行的資料
print(line)
uj5u.com熱心網友回復:
比如原始檔案存在d:/trains里,轉換后的檔案存到d:/middles下,下面的代碼可以按檔案拆分
import os, time
t1 = time.time()
car2file = {}
file_arr = []
one_file_car_num = 100
file_no = 1
car_no = 0
dest_folder = 'd:/middles2'
if not os.path.exists(dest_folder):
os.mkdir(dest_folder)
file_arr.append(open(os.path.join(dest_folder,'%s.txt' % file_no), 'w'))
folder = 'd:/trains'
train_files = os.listdir(folder)
for file_name in train_files:
line_no = 0
full_file_name = os.path.join(folder,file_name)
print('read ', full_file_name)
with open(full_file_name, 'r') as fr:
for line in fr:
line_no += 1
if line_no % 1000000 == 0: print(line_no, time.time()-t1) # 每100萬行列印一下
if len(line) < 4: continue
data = line.split(',')
car_id = data[0]
if car_id in car2file:
fw = car2file[car_id]
else:
if car_no == one_file_car_num:
file_no += 1
car_no = 0
file_arr.append(open(os.path.join(dest_folder,'%s.txt' % file_no), 'w'))
car_no += 1
fw = file_arr[-1]
car2file[car_id] = fw
fw.write(line)
print('finish ', full_file_name)
for f in file_arr:
f.close()
print(time.time()-t1)
uj5u.com熱心網友回復:
非常有啟發,萬分感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/81701.html
下一篇:計算機學科課程知識體系回顧初步
