gpt4 book ai didi

java - MapByteBuffer 比 BufferReader 更快吗?

转载 作者:行者123 更新时间:2023-12-02 04:20:04 24 4
gpt4 key购买 nike

我正在尝试从文本文件中提取特定数据。我使用 bufferreader 逐行读取文件,以便我可以处理该行。

以下是我编写的代码:

File CAD = new File (filename);

try (FileReader fileReader = new FileReader(CAD))
{
String bn = CAD.getName();
String[] bn2 = bn.split("\\.");
BOARD_NAME= bn2[0];
StringBuilder PACKAGE = new StringBuilder(),
GRAPHIC = new StringBuilder(),
PADS_DIA = new StringBuilder(),
PADS = new StringBuilder(),
COMPONENTS = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(fileReader))
{
String line;

while ((line = bufferedReader.readLine()) != null)
{
if (line.startsWith("J!"))
{
String[] units = line.split("!");
UNITS = units[8];

}

else if (line.startsWith("A!REFDES!COMP_CLASS!"))
{

while (!"A!NET_NAME!REFDES!PIN_NUMBER!PIN_NAME!PIN_GROUND!PIN_POWER!".equals(line = bufferedReader.readLine()))
{
if (line.startsWith("S!"))
{
String[] data = line.split("!");
COMPONENTS.append(data[1])
.append("!")
.append(data[8])
.append("!")
.append(data[10])
.append("!")
.append(data[11])
.append("!")
.append(data[12])
.append("\n");


}
}


}

else if (line.startsWith("A!PAD_NAME"))
{

do
{

if (line.startsWith("S!") && line.contains("00001"))
{
String[] data = line.split("!");
if ("CIRCLE".equals(data[6]))
{
PADS.append(data[1])
.append("!C!")
.append(data[7])
.append("!")
.append(data[8])
.append("!TOP")
.append("\n");

}

else if (data[6].equals(""))
{
PADS.append(data[1])
.append("!0!")
.append(data[7])
.append("!")
.append(data[8])
.append("!TOP")
.append("\n");
}

else
{
PADS.append(data[1])
.append("!R!")
.append(data[7])
.append("!")
.append(data[8])
.append("!TOP")
.append("\n");
}
}

else if (line.startsWith("S!") && line.contains("BOTTOM"))
{
String[] data = line.split("!");
if ("CIRCLE".equals(data[6]))
{
PADS.append(data[1])
.append("!C!")
.append(data[7])
.append("!")
.append(data[8])
.append("!BOTTOM")
.append("\n");
}

else if (data[6].equals(""))
{
PADS.append(data[1])
.append("!0!")
.append(data[7])
.append("!")
.append(data[8])
.append("!BOTTOM")
.append("\n");
}

else
{
PADS.append(data[1])
.append("!R!")
.append(data[7])
.append("!")
.append(data[8])
.append("!BOTTOM")
.append("\n");
}


}

else if (line.startsWith("S!") && line.contains("~DRILL"))
{

String[] data = line.split("!");
PADS_DIA.append(data[1])
.append("!")
.append(data[6])
.append("\n");

}

}while (!"A!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG!GRAPHIC_DATA_1!GRAPHIC_DATA_2!GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5!GRAPHIC_DATA_6!GRAPHIC_DATA_7!GRAPHIC_DATA_8!GRAPHIC_DATA_9!SUBCLASS!SYM_NAME!REFDES!".equals(line = bufferedReader.readLine()));
}

if (line.startsWith("A!SYM_NAME!"))
{
int k =0,j=0;
String[] data1 = line.split("!");
for (int i =0; i<data1.length;i++)
{
if (data1[i].equals("PIN_NUMBER"))
{
k=i;
}
else if (data1[i].equals("PIN_ROTATION"))
{
j=i;
}
}
while(!"A!VIA_X!VIA_Y!PAD_STACK_NAME!NET_NAME!TEST_POINT!".equals(line = bufferedReader.readLine()))
{
if (line.startsWith("S!"))
{
String[] data = line.split("!");
if (data[8].equals("")||data[8]==null)
{}
else
{
PACKAGE.append(data[1])
.append("!")
.append(data[k])
.append("!")
.append(data[k+1])
.append("!")
.append(data[k+2])
.append("!")
.append(data[k+3])
.append("!")
.append(data[k+4])
.append("!")
.append(data[j])
.append("\n");
}
}
}


}

else if (line.startsWith("A!CLASS!SUBCLASS!GRAPHIC_DATA_NAME!"))
{

while (!"A!SUBCLASS!PAD_SHAPE_NAME!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG!GRAPHIC_DATA_1!GRAPHIC_DATA_2!GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5!GRAPHIC_DATA_6!GRAPHIC_DATA_7!GRAPHIC_DATA_8!GRAPHIC_DATA_9!PAD_STACK_NAME!REFDES!PIN_NUMBER!".equals(line = bufferedReader.readLine()))
{
if (line.startsWith("S!BOARD GEOMETRY!OUTLINE"))
{
//to find the diamension x and y of board
String data[]=line.split("!");
double valuex = Double.parseDouble(data[6]);
double valuey = Double.parseDouble(data[7]);
PANEL_X.add(valuex);
PANEL_Y.add(valuey);

}

else if (line.startsWith("S!REF DES"))
{
String data[] = line.split("!");
if (data[2].equals("ASSEMBLY_TOP")||data[2].equals("DISPLAY_TOP"))
{
GRAPHIC.append(data[12])
.append("!")
.append("TOP")
.append("\n");
}

else if(data[2].equals("ASSEMBLY_BOTTOM")||data[2].equals("DISPLAY_BOTTOM"))
{
GRAPHIC.append(data[12])
.append("!")
.append("BOTTOM")
.append("\n");
}
}
}


double max_x = max(PANEL_X);
double min_x = min(PANEL_X);
double max_y = max(PANEL_Y);
double min_y = min(PANEL_Y);
double diamensionx = max_x - min_x;
double diamensiony = max_y - min_y;
MIN_X = min_x;
MIN_Y = min_y;
BOARD_X = diamensionx;
BOARD_Y = diamensiony;
BOARD_Z = 62.9921;

}

ArrayList<String> $TEMP_LIST = new ArrayList<>(asList(GRAPHIC.toString().split("\n")));
HashSet<String> graphic = new HashSet<>($TEMP_LIST);
GRAPHIC_LIST = new ArrayList<>(graphic);
PACKAGE_LIST = new ArrayList<>(asList(PACKAGE.toString().split("\n")));
PADS_LIST = new ArrayList<>(asList(PADS.toString().split("\n")));
PADS_DIA_LIST = new ArrayList<>(asList(PADS_DIA.toString().split("\n")));
COMPONENTS_LIST = new ArrayList<>(asList(COMPONENTS.toString().split("\n")));
}

}
fileReader.close();
}

在我的代码中,仍然有许多 if else 条件。当我尝试从大约 20MB 的文件中提取时,需要大约 30 秒的时间。但是当我尝试读取大约 200MB 大小的文件时,需要很长的时间,比如 30 多分钟。我的 friend 建议我使用 MappedByteBuffer 来处理得更快。

我还是 Java 新手。那么在这种情况下,MappedBuffer 的执行速度比 BufferReader 更快吗?如果是,我该如何逐行处理数据?

最佳答案

我怀疑您的问题出在 BufferedReader 上,它的速度足以满足几乎所有用途。使用 MappedByteBuffer 确实允许您一次性将文件的内容(或部分内容)读入内存,但是您处理的是 ByteBuffer 而不是行文本,并且您不太可能通过它获得显着的性能改进。

如果你删除 while 循环的内容,只读取这些行而不进行任何处理,你会发现瞬间读取了 20MB 的文件。

一个明显的(较小的)改进是将 line.split("!") 移至实际需要的范围。我不确定您显示的代码是否是您的实际代码(可能不是因为您将 split() 拼写为 splits(),但在示例代码中您仅当以 cga 开头时才需要分割该行。在没有看到实际代码的情况下,很难指出所有导致速度变慢的位置(当然,您可以使用探查器)。

最后一个建议,如果您专业编写 Java,您可能希望避免非 Java 内容,例如变量名中的 $ 以及在自己的行上打开大括号(Java 遵循 1TBS )。这对可能阅读您的代码的其他 Java 开发人员很有帮助。

关于java - MapByteBuffer 比 BufferReader 更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32881246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com