我的老板要我开发一个简单的Java应用程序来对包含关键字列表的xls文件进行排序。一切正常,但对于大的xls文件,我的应用程序需要非常非常长的时间来完成她的工作。 我认为我的算法并没有真正优化,但我已经看到我的jar的执行不会影响我的计算机的所有性能(我老板的Windows 7 Pro 32位),以及实际上它在CPU和memoty上实际上没有使用任何东西。 所以,在这里,我的问题是,如何让我的程序能够在功率和内存中运用他需要的所有东西来运行和排序像兰博基尼那样的xls? 谢谢!
编辑:这是我的代码,分为两个块:一个主类和一个帧类:
public class Frame extends JFrame implements ActionListener
{
/**
*
*/
private static final long serialVersionUID = 1L;
JTextField input;
JTextField output;
JTextField result;
JTextArea gomin;
JTextArea info;
Frame()
{
JFrame jfrm = new JFrame("App CRI");
jfrm.setLocation(100, 100);
jfrm.setLayout(new BorderLayout());
jfrm.setSize(400, 170);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setResizable(false);
input = new JTextField(10);
output = new JTextField(10);
result = new JTextField(10);
gomin = new JTextArea();
result.setEditable(false);
info = new JTextArea("Merci de renseigner le nom des fichiers sans extension.\nExemple: \"10-09-2014\" pour le fichier \"10-09-2014.xls\".");
info.setEditable(false);
// set input fields
JPanel inFieldPane = new JPanel();
inFieldPane.setLayout(new GridLayout(2,2));
inFieldPane.add(new JLabel("Input file name:"));
inFieldPane.add(input);
input.addActionListener(this);
inFieldPane.add(new JLabel("Output file name:"));
inFieldPane.add(output);
output.addActionListener(this);
jfrm.add(inFieldPane,BorderLayout.NORTH);
// set submit button
JPanel submitPane = new JPanel();
submitPane.setLayout(new FlowLayout());
submitPane.add(info);
JButton submitButton = new JButton("Let's go !");
submitButton.addActionListener(this);
submitPane.add(submitButton);
jfrm.add(submitPane,BorderLayout.CENTER);
// display results
JPanel outFieldPane= new JPanel();
outFieldPane.setSize(350, 50);
outFieldPane.add(gomin);
gomin.setSize(350, 50);
gomin.setEditable(false);
jfrm.add(outFieldPane,BorderLayout.SOUTH);
jfrm.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("Let's go !"))
{
gomin.setText(Main.doIt(input.getText().trim(), output.getText().trim()));
}
}
}
这是我的主要课程,我的所有方法,即使我也有,我还没有在其他课程中分离这些方法,而且我知道质量并不差:
public class Main {
public static ArrayList<String> loadKeywords(String src)
{
ArrayList<String> arr = new ArrayList<String>();
try
{
InputStream inp = new FileInputStream(src);
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row r;
for(int i = 1; i <= sheet.getLastRowNum(); i++)
{
r = sheet.getRow(i);
if(r.getCell(0) != null && r.getCell(0).getCellType() == Cell.CELL_TYPE_STRING)
arr.add(r.getCell(0).getRichStringCellValue().getString());
}
} catch (FileNotFoundException e)
{
System.out.println("Keywords file undetected !");
e.printStackTrace();
} catch (InvalidFormatException e)
{
System.out.println("Invalid format. Oups.");
e.printStackTrace();
} catch (IOException e)
{
System.out.println("Fuck ! IOException !");
e.printStackTrace();
}
return arr;
}
public static boolean isValidCri(String inputString, ArrayList<String> arr)
{
for(int i =0; i < arr.size(); i++)
{
if(Pattern.compile(Pattern.quote(arr.get(i)), Pattern.CASE_INSENSITIVE).matcher(inputString).find())
{
return true;
}
}
return false;
}
public static void process()
{
System.out.println("Process en cours ... ");
ArrayList<String> arr = loadKeywords("C:\\Users\\9108250x\\Desktop\\app_cri\\keywords.xls");
if(arr.isEmpty())
System.out.println("rat�, erreur au chargement des keywords :(");
else
{
try
{
InputStream inp = new FileInputStream("C:\\Users\\9108250x\\Desktop\\app_cri\\01-09-2014.xls");
Workbook wb = WorkbookFactory.create(inp);
Sheet itaSheet = wb.getSheetAt(0);
Row r;
int endy = itaSheet.getLastRowNum();
for(int i = 1; i <= endy; i++)
{
r = itaSheet.getRow(i);
if(r.getCell(27) != null && r.getCell(27).getCellType() == Cell.CELL_TYPE_STRING)
{
if(! isValidCri(r.getCell(27).getRichStringCellValue().getString(), arr))
{
itaSheet.shiftRows(i+1, itaSheet.getLastRowNum()+1, -1);
i--;
endy--;
}
}
else
{
itaSheet.shiftRows(i+1, itaSheet.getLastRowNum()+1, -1);
i--;
endy--;
}
}
FileOutputStream fileOut = new FileOutputStream("C:\\Users\\9108250x\\Desktop\\app_cri\\outPut.xls");
wb.write(fileOut);
fileOut.close();
}
catch (FileNotFoundException e)
{
System.out.println("File not found, bad url.");
e.printStackTrace();
}
catch (InvalidFormatException e)
{
System.out.println("Invalid file format.");
e.printStackTrace();
}
catch (IOException e)
{
System.out.println("Fuck, doesn't work !");
e.printStackTrace();
}
System.out.println("et termin� avec succ�s !");
}
}
public static String doIt(String input, String output)
{
String result = "succeed !";
ArrayList<String> arr = loadKeywords(".\\keywords.xls");
if(arr.isEmpty())
result = "no keywords";
else
{
try
{
InputStream inp = new FileInputStream(".\\"+ input +".xls");
Workbook wb = WorkbookFactory.create(inp);
Sheet itaSheet = wb.getSheetAt(0);
Row r;
int endy = itaSheet.getLastRowNum();
for(int i = 1; i <= endy; i++)
{
r = itaSheet.getRow(i);
if(r.getCell(27) != null && r.getCell(27).getCellType() == Cell.CELL_TYPE_STRING)
{
if(! isValidCri(r.getCell(27).getRichStringCellValue().getString(), arr))
{
itaSheet.shiftRows(i+1, itaSheet.getLastRowNum()+1, -1);
i--;
endy--;
}
}
else
{
itaSheet.shiftRows(i+1, itaSheet.getLastRowNum()+1, -1);
i--;
endy--;
}
}
FileOutputStream fileOut = new FileOutputStream(".\\"+ output +".xls");
wb.write(fileOut);
fileOut.close();
}
catch (FileNotFoundException e)
{
System.out.println("File not found, bad url.");
result = "file not found";
e.printStackTrace();
}
catch (InvalidFormatException e)
{
System.out.println("Invalid file format.");
result = "invalid operation";
e.printStackTrace();
}
catch (IOException e)
{
System.out.println("Doesn't work !");
result = "IO exception";
e.printStackTrace();
}
catch ( Exception e)
{
result = "unknow exception";
}
System.out.println("et termin� avec succ�s !");
}
return result;
}
/**
* @param args
*/
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new Frame();
}
});
// process();
}
}
答案 0 :(得分:1)
您的算法对内存的效率可能非常低,但如果您需要分配更多内存,请使用以下参数:
-Xmx2G - 这会将最大内存使用量设置为2GB。将2G更改为您想要的任何内容,将512M更改为512MB,依此类推
-Xms1G - 设置应用程序启动的ram数量(最小值)。您可以使用与-Xmx相同的方式更改此内容。
同样,它可能是您的算法,但您可以尝试更改内存分配。
编辑:刚看到你的代码,它可能不是你自己的算法,而是WorkBook的工作方式。在这种情况下,我建议增加分配的内存。答案 1 :(得分:0)
也许你应该看一下这篇博文:Java – Reading a Large File Efficiently