首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 讀取 Level-1 行情 DBF 文件極致優化(一):內存硬盤與文件變更通知

     編輯:Java 綜合教學

Java 讀取 Level-1 行情 DBF 文件極致優化(一)

背景:證券系統需極致低延遲行情接入分發,支持 Level-1/Level-2 多源。Level-1 由行情小站定時覆寫 DBF 文件 (上海 show2003.dbf、深圳 sjshq.dbf),目標:文件更新後最快時間讀取入內存、轉對象、轉類型。共 6 項優化,本文介紹前兩項。

優化一:採用內存硬盤

內存硬盤極大提升讀寫速度,完美契合場景:

  1. 行情小站寫入內存盤 → 加速寫入。
  2. 本系統讀取內存盤 → 加速讀取。
  3. 掉電丟失無妨,行情文件本身臨時;亦可開啟持久化功能。

Windows 下對比多款軟件 (參考《12 RAM Disk Software Benchmarked...》) 選擇 Bond Disc (官網)。實測讀取速度提升有限 (文件僅 1-2MB,NIO 已很快),但意義在於:

  • 避免磁盤繁忙時串行瓶頸,保證延遲穩定。
  • 源頭寫入加速,整體鏈路受益。

優化二:採用 JNotify 通知替代輪詢

傳統輪詢 (如 10ms/次) 平均延遲 5ms,效率低。JNotify 基於 OS API (JNI) 監聽目錄變更,發現文件修改即時回調。

public void addWatcher(String folder, String file) throws Exception {
    int mask = JNotify.FILE_MODIFIED; // 僅關心修改
    boolean watchSubtree = false;
    watchId = JNotify.addWatch(folder, mask, watchSubtree, new JNotifyListener() {
        public void fileModified(int wd, String root, String name) {
            if (!file.equalsIgnoreCase(name)) return; // 過濾非目標文件
            readHangqingFile(folder + File.separator + file);
        }
        public void fileRenamed(int wd, String root, String oldN, String newN) {}
        public void fileDeleted(int wd, String root, String name) {}
        public void fileCreated(int wd, String root, String name) {}
    });
}

部署注意:除 JAR 外需放置 .dll/.so 本地庫,Eclipse 需配置 Native library location,運行時用 -Djava.library.path 指定。

測試:通知延遲 <1ms (受限於文件修改時間精度),遠優於輪詢。

待續…… (下篇講 NIO 讀取與緩存複用)

原文:https://www.cnblogs.com/Binhua-Liu/p/5609396.html

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved