簡體   English   中英

從JAVA中的文件中高性能刪除字符串

[英]High Performance deletion of a String from file in JAVA

我們致力於電子商務領域。 我們以很高的速度處理每個訂單。 每個訂單都可以根據用戶取消和替換。

無論發生什么情況,都不能錯過訂單。 因此,無論收到什么定單,我們都會以字符串形式存儲在文件中,並且當用戶取消定單或定單被執行時,我們將從文件中刪除相應的字符串。

也可能會出現這樣的情況,例如用戶一次可以取消50個以上的訂單。 結果,從文件中刪除字符串的通用方法:將所有字符串存儲在文件中並通過在列表中進行搜索將其刪除會導致很高的延遲。

對於一個取消請求,這不是問題,但是當用戶一次要取消所有訂單時,這種方法會引起很大的問題。

我當前用於從文件中刪除字符串的代碼:

 public void deleteFromFile(String clordID) throws InterruptedException {
//delete based on clorid from the file
        BufferedReader in = null;
   String line = null;
    try {
        in = new BufferedReader(new FileReader(dir + "\\pendingOrders.txt"));
        List<String> listLines = new ArrayList<>();

        while ((line = in.readLine()) != null) {
            if (!(line.contains(clordID))) { // check for Order ID which is unique for every string
                listLines.add(line);
            }
        }
        in.close();
        BufferedWriter bufferedWriter1 = new BufferedWriter(new FileWriter(dir + "\\pendingOrders.txt"));
        bufferedWriter1.write("");
        bufferedWriter1.close();
        BufferedWriter bufferedWriter2 = new BufferedWriter(new FileWriter(dir + "\\pendingOrders.txt", true));
        for (String msg : listLines) {
            bufferedWriter2.write(msg + "\n");
        }
        //in.close();
        bufferedWriter2.close();

    } catch (IOException ex) {
        System.err.println(ex.getMessage());
    }
}//Delete

有沒有辦法提高性能? 每次提出取消請求時,將所有字符串存儲到列表中,然后再次清除文件並寫入文件中,肯定會導致高延遲。

好吧,讓我們見識一下-

是的,您幾乎不需要微調就可以提高性能。

  1. 根據交易量將文件分成較小的塊。 每天甚至每小時可能是1個文件。
  2. 我相信您的方法中的clordID參數是orderid,在其中維護日期的順序是ddMMyyyy-orderid。
  3. 當您收到刪除請求時,請先從訂單ID中提取日期,然后打開屬於該日期的文件。 這將減少您需要迭代的行數。

注意:-我相信您沒有在運營任何電子商務網站,而是在做一些學校暑期項目。 但是,如果您將其用於實時應用程序。 請聽聽已經給您很好建議的人們。

盡管在我的評論中提到了使用文件的陷阱,再看一下您的代碼,我仍然可以找到以下改進之處,

  1. 如果clorID是唯一的,為什么要一直檢查到文件結尾? 一旦找到包含它的行,您是否不應該退出for循環?
  2. 由於clorID是唯一的,因此它將僅在文件中存在一次。 那么為什么需要創建列表?
  3. 如果存在創建clorID的模式(如果是序列,時間戳等),則根據該模式創建文件。 (例如,對於clorid 1-10000,轉到File1,從10001到20000轉到File2,依此類推。)這樣可以大大減少所需的時間。
  4. 奇怪的是,盡管您在語句中提到要刪除字符串,但是您的代碼卻沒有這樣做。 您正在做的是再次寫入相同的字符串! 為什么? 您應該做的是從未完成的訂單中刪除字符串,並將其放入cancelledOrders.txt或fulfilledOrders.txt中

PS:同樣,正如我在評論中所指出的,還有許多其他評論,如果這是真正的電子商務網站並投入生產,那將是一場災難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM