2017-09-26 54 views
0

我們致力於電子商務領域。我們以極高的速度處理每一筆訂單。每個訂單都可以根據用戶取消和更換。從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 

是否有提高性能的方法嗎?每次取消請求引發時,將所有字符串存儲到列表中,並再次清除文件並寫入文件肯定會導致高延遲。

+2

您使用的是平面文件嗎?你瘋了? – Kayaman

+0

我只是使用一個簡單的文本文件。新的方法是真的可以接受,但我現在不能使用任何數據庫 –

+2

你沒有運行一個高性能的電子商務應用程序,那裏什麼都不能錯過。你正在運行一個可以發生任何事情的玩具項目。使用事務數據庫。這就是他們的目的。 –

回答

1

那麼讓我們試試看 -

是的,你可以提高性能,少數微調。

  1. 根據事務量將文件拆分成更小的塊。可能是每天或甚至每小時1個文件。
  2. 我相信在你的方法中的clordID參數是orderid,維護日期的順序id就像ddMMyyyy-orderid一樣。
  3. 當您收到刪除請求時,首先從訂單ID提取日期,然後打開屬於當天的文件。這將減少您需要迭代的行數。

注: -我相信你沒有運行任何電子商務網站,但做一些學校暑期項目。但是,如果你正在使用它的實時應用程序。請聽已經給你很好建議的人。

1

儘管我的意見,我提到使用的文件,看你的代碼的陷阱,我可以找到以下改進,

  1. 如果clorID是獨一無二的,你爲什麼要檢查它的權利,直到文件的末尾?一旦找到包含它的行,你不應該跳出for循環嗎?
  2. 由於clorID是唯一的,它只會在您的文件中出現一次。爲什麼你需要創建一個列表呢?
  3. 如果存在創建clorID的模式(如果它是一個序列,時間戳記等),則根據模式創建文件。 (例如clorid 1 - 10000轉到File1,10001到20000轉到File2等等。)這將大大減少所花費的時間。
  4. 奇怪的是,儘管你在聲明中提到你想要刪除字符串,但你的代碼並沒有這樣做。你正在做的是再次寫同一個字符串!爲什麼?你應該做的是從pendingOrders.txt 中刪除字符串,並將其放入cancelledOrders.txt或fulfilledOrders。txt

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