如何加快阅读/写作的速度

时间:2015-07-06 22:06:32

标签: java excel apache apache-poi

我正在使用Apache POI作为实习生在这里读取/写入我公司的excel文件。我的程序通过excel文件,这是一个带有顶行计算机名称和左列用户名的大正方形。 240台计算机和342位用户。所有空格中的[计算机] [用户]表格为0,程序为每台计算机调用PSLoggedon并获取当前登录的用户名并增加0,所以在一个月后运行它后,它会显示谁登录了每台计算机最多。到目前为止它运行大约25分钟,因为我在实际调用PSLoggedon之前使用套接字来检查socket.connect。

如果没有读取或写入excel文件,只需调用所有PSLoggedon调用每台计算机,大约需要9分钟。因此,阅读和写作显然需要10-15分钟。问题是,我在计算机上调用PSLoggedon,然后打开excel找到[计算机] [用户]的[x] [y]点,然后写入+ = 1然后关闭它。因此,我认为它需要这么长时间的原因是因为它打开和关闭文件这么多?我可能完全错了。但我无法通过一次打开和读/写,只打开和关闭文件一次来想出一种方法来加快速度。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

正常情况下,Apache-POI非常快,如果您遇到某些问题,那么您可能需要检查以下几点:

  1. POI的日志记录可能已启用,您需要将其关闭: 您可以将其中一个-D添加到JVM设置中以执行此操作:

    -Dorg.apache.poi.util.POILogger=org.apache.poi.util.NullLogger

  2. 您可能正在将VM堆设置为较低值,请尝试增加。

  3. 首选XLS而不是XLSX。

答案 1 :(得分:1)

  1. 获取HSQLDB(或其他进程内数据库,但这是我过去使用过的)。将它添加到您的构建中。
  2. 您现在可以创建基于文件的数据库或内存数据库(我会使用基于文件的,因为它允许您在运行之间保持状态)simply by using JDBC。创建一个包含User, Computer, Count
  3. 列的表格
  4. 当您找到具有INSERT
  5. 的用户时,在您的阅读帖子中,UPDATEPSLoggedon您的表格
  6. 完成数据收集后,您可以SELECT Computer, User, Count from Data ORDER BY Computer, User(或根据您的Excel文件布局切换订单),循环浏览ResultSet并直接编写结果。

答案 2 :(得分:1)

这是一个老问题,但从我看到的情况来看:

  1. 由于您正在采样并使用Excel,因此可以安全地假设一致性和原子性并不重要吗?您只是估算部分使用情况,并且如果用户登录并在观察之间注销,则无需关心。
  2. Excel文件是否通过慢速网络链接存储?打开和关闭文件240次可能会带来很大的开销。如下:
  3. 您需要打开一次Excel文件才能获取计算机列表。那时,只需将矩阵的全部内容快照到Map<ComputerName, Map<UserName, Count>>。同时获取List<ComputerName>List<UserName>以记住行/列标题。整个电子表格的整数不到90,000 ---无需引入繁重的数据库机器。
  4. 对于240台计算机,单线程,每台计算机大约需要2.25秒。这是PSLoggedOn的预期吞吐量吗?您是否可以一次创建一个线程池并查询所有240台计算机或少量轮次?
  5. 然后,解析结果,增加地图并将其转储回Excel文件。您是否有可能看到以前不在Excel中的新用户?这些内容需要添加到MapList<UserName>