当前位置: 首页 > 面试题库 >

我应该如何处理Java中的大型数组?

陶健
2023-03-14
问题内容

我有一种算法,当前会分配很大的双精度数组,它会经常更新和搜索。数组的大小为N ^
2/2,其中N是算法在其上进行操作的行数。为了与算法周围的应用程序相关联,我还必须保留整个内容的副本。

当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆的限制。到现在为止,我还没有要求使用该算法的人员更新-
Xmx设置以分配更多的空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要此数组的大小超出内存的大小。

我已经计划更改算法以减轻这种大型阵列的必要性,并在该领域中取得了一些可喜的结果。但是,这是对过程的根本更改,在达到我当前代码的高度完善的条件之前,还需要进行大量工作,该代码在生产中已经非常成功地运行了好几年了。

因此,当我完善我的新算法时,我想延长现有算法的寿命,这意味着要解决与分配庞大的double数组相关的堆限制。

我的问题是最好的处理方式是什么?我应该使用nio
FileChannel和MappedByteBuffer,还是有更好的方法。如果我确实使用nio方法,那么与相同大小的内存阵列相比,我希望获得什么样的性能提升?

谢谢


问题答案:

如果您在PC上运行,则映射文件的页面大小可能为4 KB。

因此,问题真正出在我是否开始将数据交换到磁盘上,“我对现在是文件的RAM的随机访问有多随机”?

并且(…是否可以,如果可以…)如何排序双精度数以最大化在一起访问4K页中的双精度数的情况,而不是在下一个4K磁盘获取之前在每个页面中一次访问几个双精度数的情况?

如果使用标准IO,则可能仍想以块的形式进行读写,但其他块可能会更小。扇区将至少为512字节,磁盘群集更大,但是鉴于每个IO都有内核往返开销,那么什么大小的读取是最好的?

很抱歉,但恐怕您的最佳下一步在很大程度上取决于所使用的算法和数据。



 类似资料:
  • 问题内容: 我正在学习MySQL并尝试使用子句。当我如下使用它时: 我收到以下错误: MySQL服务器正在使用–secure-file-priv选项运行,因此它无法执行此语句 我该如何解决这个错误? 我已经检查了关于同一错误消息的另一个问题,但仍然找不到解决方案。 我正在使用MySQL 5.6 问题答案: 它按预期工作。您的MySQL服务器已使用--secure-file- priv 选项启动,该

  • 问题内容: 有人可以为我指出一份良好的初学者指南,以安全地运行部分由用户输入构成的SQL查询吗?我正在使用Java,但是语言无关的指南也很好。 期望的行为是,如果有人在GUI中键入类似 数据库应将其视为文字字符串,并安全地存储它而不会删除任何表。 问题答案: 您肯定要使用PreparedStatement。他们很方便。这是一个例子。

  • 问题内容: 我有一个表格,希望能够显示“从Y到X排名”的数据。特别是,我希望能够以一种相对有效的方式(即不选择表中的每一行)来显示单个行的数据。排名本身很简单,它是对表中单列的直接ORDER BY。 在这方面,Postgres似乎提出了一些独特的挑战。AFAICT它没有RANK或ROW_NUMBER或同等功能(至少在8.3中,我暂时停留在此位置)。邮件列表档案中的规范答案似乎是创建一个临时序列并从

  • 你和我都想去听音乐会,但只剩下一张票了。我们都试图同时预订那张票。使用AWS SDK for PHP的PHP脚本运行以下updateItem API调用,该调用试图将“票据”的“状态”从0(可用)更改为1(保持)。 对于这个用例,这是正确的方法吗? 有人看过DynamoDB文档吗? 如果这是一个正确的实现,对测试方案有什么建议吗?

  • 我使用Oracle数据库和驱动程序,我使用从ResultSet获取Clob,然后在方法中将其转换为String:

  • 我一直在尝试创建一个,它也有一个处理程序。我阅读了这个问题的答案并知道如何做到这一点。 我的问题只是关于它的结束部分。 1) 我知道我可以写:或,但我不会写。在这里的注释中解释了这一点,因为您需要处理参数操作。 这是否意味着由于处理程序是