王丞,李磊,張銘彬
(1.江蘇淮安水利勘測設計研究院有限公司,江蘇 淮安 223005; 2.中國礦業大學 環境與測繪學院,江蘇 徐州 221116)
Linux是一套開源的類UNIX操作系統,其具有支持多用戶、多進程、多線程、實時性較好等優點[1-2]。正因為這些優點,國際上很多知名的GNSS數據處理軟件基本上都是基于Linux開發,如GAMIT、Bernese、Panda等,因此許多IGS分析中心將Linux系統作為GNSS數據處理平臺[3-7]。
目前國際上各大IGS分析中心,每天都需要使用大量的衛星跟蹤站的觀測數據,其中數據下載速度和完整性直接影響分析中心數據產品的解算精度和時效性。為了確保數據產品的解算精度和時效性,各個分析中心一般是采用提高網速、分站下載、優先測站下載、多臺電腦同時下載的策略來確保數據下載的完整性和時效性。但采用提高網速和多臺電腦同時下載這種策略顯得不夠靈活。針對這種情況本文對傳統的數據下載方式進行了改進,改進的數據下載方式可在較短的時間內實現數據高效完整的下載。下面將具體介紹改進的數據下載方式程序實現。
目前IGS數據中心有5個,分別是美國NASA戈達德空間飛行中心地殼動力學數據信息系統(CDDIS)、美國斯克里普斯海洋地理研究所(SIO)、法國國家地理研究所(IGN)、SOPAC以及中國的武漢大學(WHU)[8-9]。IGS數據中心存儲的數據可謂是海量的,清晰的數據歸檔方式便于用戶查找與下載數據[9-11]。IGS各種數據是按照一定的目錄進行編排存儲,不同的數據中心文件存儲目錄有一定的不同。下面以CDDIS數據中心為例介紹其數據歸檔方式,IGS數據歸檔方式如圖1所示。圖1中:wwww表示GPS周;yyyy表示年;doy表示年積日;yyn表示GPS導航文件夾;yyl表示GALILEO導航電文;yyo表示觀測值文件;yyd表示的壓縮的觀測值文件,部分文件以及文件的命名規則在此不作具體的介紹。用戶可根據需求從相應的路徑下載相應文件,下面將具體介紹相應的下載程序。
Linux系統mget數據下載方法需要ftp這個用來登陸服務器的命令的配合才能進行數據下載。以下載MGEX(Multi-GNSS Experiment)數據為例,其具體實現程序如下
01 set file_name=“”
02 foreach s (`cat $site_list`)
03 set file_name=($file_name $s$doy$chour[$ihour].$yy”o.Z”)
04 end
05 set LOCALPATH=/data/
06 set HOST=“cddis.gsfc.nasa.gov”
07 set USER=“anonymous”
08 set PASS=‘^M’
09 ftp —inv $HOST ?EOF
10 user $USER $PASS
11 lcd $LOCALPATH
12 cd/gnss/data/campaign/mgex/hourly/rinex3/$yyyy/$doy/$hour/
13 mget $file_name
14 bye
15 EOF
使用mget進行下載數據時需要進行以下三步:
1) 首先將需要下載的文件名存儲在一個數組中。如以上程序的03行,將需要下載的數據的文件名存儲在file_name中;
2) 然后登陸遠程的ftp,進入遠程ftp數據存儲的路徑下。在登陸遠程的服務器之前需要設置遠程ftp的主機名、登陸的用戶名以及用戶密碼,由于IGS數據中心的數據可以免費下載,可以使用”anonymous”匿名登錄,登錄密碼’^M’(相當于“回車”的作用)。代碼的09行就是用來登入遠程的服務器,12行是進入遠程ftp數據存儲的路徑;
3) 最后利用mget命令下載需要下載的數據。如以上程序的13行。
mget方法雖然可實現批量下載,但是其缺點是每次批量下載數不能超過50個,并且下載初始化過程中會花費很長的時間,因此mget下載方法效率并不是很高。以上介紹的是mget數據下載方法,接下來將介紹wget數據下載方法。
wget數據下載方法相對mget命令的區別在于其每下載一次數據需要登陸一下對方的ftp。理論上下載效率不如mget,但是在實際測試過程中,其下載效率比mget好。wget的下載方法具體實現如下
path=/cddis.gsfc.nasa.gov/pub/gnss/data
set site_list=site_list_mgex
set chour=(a b c d e f g h i j k l m n o p q r s t u v w x)
set ihour=$hour+1
foreach s (`cat $site_list`)
wget ftp://$path/hourly/$yyyy/$doy/$hour/$s$doy$chour[$ihour].$yy"o.Z"
wget ftp://$path/hourly/$yyyy/$doy/$hour/$s$doy$chour[$ihour].$yy"l.Z"
wget ftp://$path/hourly/$yyyy/$doy/$hour/$s$doy$chour[$ihour].$yy"g.Z"
wget ftp://$path/hourly/$yyyy/$doy/$hour/$s$doy$chour[$ihour].$yy"n.Z"
end
其中:$path為多模GNSS數據下載路徑;$yyyy、$doy、$hour分別為年、年積日、小時,均可以作為變量輸入;$site_list為多模觀測值數據的測站列表;以UTC時的2015年5月22日0時為例。其中$yyyy=2015、$doy=142、$hour=05;其中$site_list的部分列表如表1所示。

表1 2015-05-22的不同小時文件夾下多模觀測值數據存儲情況
由表1結果可以看出mgex數據每小時更新情況可分為三種:
1) 部分測站只更新觀測值數據例如aira測站;
2) 部分測站既更新觀測值數據也更新導航數據,但是在某一時段會不更新某一系統導航文件,例如dund測站;
3) 部分測站會在某一時段不更新數據,例如areg測站。
據統計mgex觀測站有110多個,IGS觀測站約460多個,按傳統下載方式進行下載,將會出現大量無數據下載登陸的情況,這樣會浪費大量下載時間。在20 Mbit/s網速下wget一次登陸與登出不進行數據下載大約需要2 s,假設按300次無數據下載登陸,那么至少浪費10 min下載時間。為了節約時間對現有的下載方式進行改進,下面將具體介紹改進的數據下載方式。
據統計mgex的觀測站有110多個,IGS(International GNSS Service)的觀測站約460多個,如果按照傳統的下載方式進行下載,將會出現很多次的無數據下載登陸,這樣會浪費大量的下載時間。在20 Mbit/s的網速下wget一次登陸和登出不進行數據下載大約需要2 s,假設按照300次的無數據下載的登陸,那么至少要浪費10 min的下載時間。在與下載高頻的數據相比較其下載所要浪費的時間將會增加4倍。為了節約時間需要對現有的下載方式進行改進,下面將具體介紹改進的方式。
針對1.2節和1.3介紹的數據下載時出現的情況,作者提出新的數據下載方式。新的下載方式是,事先登陸對方的ftp然后獲取存儲路徑下存在的數據的文件名,然后再利用wget進行下載,這樣可避免無數據下載的登陸,大大節省了數據的下載時間。具體的程序實現如下:
01 set HOST=“cddis.gsfc.nasa.gov”
02 set USER=“anonymous”
03 set PASS=‘^M’
04 set LOCALPATH=/data/
05 set PATH=/gnss/data/campaign/mgex/hourly/rinex3
06 ftp —inv $HOST ?EOF
07 user $USER $PASS
08 lcd $LOCALPATH
09 cd/$PATH/$yyyy/$doy/$hour/
10 ls/$PATH/$yyyy/$doy/$hour/$LOCALPATH> site_list.log
11 bye
12 EOF
13 awk `{print $9}` site_list.log> site_list
14 set path=/cddis.gsfc.nasa.gov/pub/gnss/data
15 foreach s (`cat $site_list`)
16 wget ftp://$path/hourly/$yyyy/$doy/$hour/$s
17 end
改進的數據下載方式需要進行三步:
1) 獲取數據存儲路徑下的各個文件的詳細信息。代碼的01~03行設置目標ftp、登錄的賬號和密碼,04~05設置本地的數據存儲路徑和ftp數據存儲路徑,代碼的06~12行表示的是登陸并且登出ftp,其中09行表示進入ftp數據存儲路徑下的文件夾,10行就是獲取mgex小時數據存儲路徑下的文件的詳細信息,其信息存儲在site_list.log文件中;
2) 從site_list.log文件中提取文件名信息。上面代碼13行就是獲取存儲路徑下存在的文件名信息。其存儲方式如表1各個時間段存在的文件名一樣;
3) 下載數據。代碼15~17行就是利用wget下載site_list中存在的文件。
下面將介紹數據自動化下載實現方式,以及對比分析傳統的下載方式與改進的下載方式的效率。
crontab命令允許指定Linux系統何時運行腳本[2,8,9,12]。自動化下載是通過Linux定時執行配置的數據下載腳本而實現的,及用戶將定時所要執行的下載任務寫在一個新的文件中,例如文件名為autorun:45 */1 * * */bin/csh/root/shell/sh_get_hourly>/root/log/sh_get_hourly.log 2>&1
該命令的時間“45 */1 * * *”為每年、每月、每天的每小時45分運行“sh_get_hourly”腳本。由于自動運行全部在后臺,不會輸出任何顯示信息,因此 “>/root/log/sh_get_hourly.log 2>&1”表示的含義是將“sh_get_hourly”運行信息賦給一個sh_get_hourly.log日志文件,這樣方便檢查運行的狀態及出現的錯誤。編輯好autorun這個定時任務文件后執行“crontab autorun”命令,將其加載到后臺中,這樣autorun中的定時任務會在指定的時間上運行。為了防止自動運行的腳本到了規定時間還沒有結束而影響其他的進程,可以用“kill”命令將其強制結束。數據自動化下載流程如圖2所示,其運行過程為
1) Linux,Crontab定時任務觸發器,觸發數據下載任務開始;
2) 運行get_data_list,腳本獲取數據中心中存在的數據測站列表;
3) 調用下載數據腳本,如調用get_hourly_data腳本,獲取數據中心小時數據文件;
4) 結束數據下載腳本運行。
實驗環境是: DELL T5810工作站,CentOS6.5linux系統平臺,20 Mbit/s電信寬帶網速。在以上實驗條件下分別采用改進的數據下載方式和傳統的數據下載方式下載高頻觀測值數據和小時觀測值數據、比較其下載效率。
2.2.1 小時數據下載
選擇下載年積日為132的 00時、12時、22時三個時段IGS的n、g、d和MGEX的n、l、g、d文件為例。比較分析改進的下載方式與傳統的下載方式在下載小時數據方面的下載效率,具體實驗結果如表2和表3所示。由實驗結果可得,改進的數據下載方式下載IGS數據平均每小時可節約34 min,下載MGEX的數據平均每小時可節約17 min.

表2 不同小時的MGEX數據下載效率對比

表3 不同小時IGS數據下載效率對比
2.2.2 高頻數據下載
選擇下載年積日為132的 00時、12時、22時三個時段的IGS、MGEX高頻的d文件為例,比較分析改進的下載方式與傳統的下載方式在下載高頻數據方面的下載效率。具體實驗結果如表4和表5所示。由實驗結果可得,改進的數據下載方式下載IGS數據平均每小時可節約80 min,下載MGEX的數據平均每小時可節約13 min.

表4 不同小時的高頻IGS數據下載效率對比

表5 不同小時的高頻MGEX數據下載效率對比
由實驗結果可以看出,隨著數據下載文件個數越多,改進的數據下載方式下載效率越明顯。
本文是作者根據實際工作經驗,發現原有的數據下載方式下載效率較低,為此改進了原有的數據下載方法。改進的數據下載方式的設計是在數據下載之前先獲取數據存儲路徑下存在的數據文件名,然后再對其進行下載,這樣可避免無數據的下載登陸與登出,有效地縮短下載數據的時間。
由表2~表4的對比結果可知改進的數據下載方式顯得更加靈活,在數據量越大的情況下改進的數據下載方式的下載效率更高。
在實際應用過程中由于IGS數據出現延遲上傳的情況,導致數據下載不完整,為了解決這一問題通過補下數據的方式來確保數據下載的完整性。本次實驗未對IGMAS數據中心的數據進行下載實驗,主要因為其數據中心在國內數據下載速度快,無需考慮數據下載效率問題。