【问题标题】:High Performance deletion of a String from file in JAVAJAVA文件中字符串的高性能删除
【发布时间】:2018-03-07 06:40:42
【问题描述】:

我们致力于电子商务领域。我们以非常高的速度处理每个订单。每个订单都可以根据用户取消和更换。

无论发生什么,都不能错过订单。因此,无论我们收到什么订单,我们都会以字符串的形式存储在一个文件中,当用户取消订单或订单完成时,我们会从文件中删除相应的字符串。

还可能出现用户一次可以取消超过 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

有没有办法提高性能?每次提出取消请求时,将所有字符串存储到列表中并再次清除文件并写入文件肯定会导致高延迟。

【问题讨论】:

  • 您使用的是平面文件?你疯了吗?
  • 我只是使用一个简单的文本文件。新方法确实可以接受,但我现在不能使用任何数据库
  • 您运行的不是一个高性能的电子商务应用程序,没有什么是不能错过的。您正在运行一个任何事情都可能发生的玩具项目。使用事务数据库。这就是他们的目的。
  • 是的,我知道,但是到目前为止我还不能使用数据库,先生。我只能使用一个文件
  • 那么你不应该担心性能。担心正确性、可读性、设计、可维护性。如果性能真的很重要,你就不会使用文件。

标签: java performance file-io


【解决方案1】:

好吧,让我们一起试试吧——

是的,您可以通过少量微调来提高性能。

  1. 根据事务量将文件分成更小的块。可以是每天甚至每小时 1 个文件。
  2. 我相信您方法中的 clordID 参数是 orderid,在其中的订单 ID 中维护日期,类似于 ddMMyyyy-orderid。
  3. 当您收到删除请求时,首先从订单 ID 中提取日期,然后打开属于该日期的文件。这将减少您需要迭代的行数。

注意:-我相信你不是在经营任何电子商务网站,而是在做一些学校暑期项目。但是,如果您将它用于实时应用程序。请听听已经有的人给你很好的建议。

【讨论】:

    【解决方案2】:

    尽管我在评论中提到了使用文件的陷阱,但查看您的代码,我可以找到以下改进,

    1. 如果 clorID 是唯一的,为什么要一直检查到文件末尾?您不应该在找到包含它的行后立即跳出 for 循环吗?
    2. 由于 clorID 是唯一的,它在您的文件中只会出现一次。那你为什么需要创建一个列表呢?
    3. 如果存在创建 clorID 的模式(如果它是序列、时间戳等),则根据该模式创建文件。 (例如,clorid 1 - 10000 转到 File1,10001 到 20000 转到 File2 等等。)这将大大减少所花费的时间。
    4. 奇怪的是,虽然您在声明中提到要删除该字符串,但您的代码并没有这样做。您正在做的是再次编写相同的字符串!为什么?你应该做的是从 pendingOrders.txt 中删除字符串 并将其放入 cancelledOrders.txt 或 fulfilledOrders.txt

    PS :同样,正如我在评论中指出的那样,还有很多其他人也指出,如果这是真正的电子商务网站并且正在投入生产,那将是一场灾难。

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2017-05-14
      • 1970-01-01
      • 2011-08-07
      • 2022-01-21
      • 2014-03-13
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多