Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提高需要加载非常大文件的单元测试的性能_Java_Performance_Unit Testing_Junit - Fatal编程技术网

Java 如何提高需要加载非常大文件的单元测试的性能

Java 如何提高需要加载非常大文件的单元测试的性能,java,performance,unit-testing,junit,Java,Performance,Unit Testing,Junit,我有一个Java NLP项目,我正在使用这个包。我有几个项目的单元测试,我喜欢频繁地运行它们,以查看微小的调整如何影响系统的输出。不幸的是,需要加载CoreNLP包才能执行其分类和标记,而且该文件太大,需要几秒钟才能加载到内存中。这看起来似乎没有太多的等待时间,但单元测试本身运行起来需要几毫秒,每次启动新的测试运行时,我都必须等待模型文件加载,这似乎很遗憾 有没有办法加载一次模型文件,然后针对内存中已经存在的模型运行后续的单元测试运行?也许像存储模型并可以从单元测试中调用的测试“服务器”之类的东

我有一个Java NLP项目,我正在使用这个包。我有几个项目的单元测试,我喜欢频繁地运行它们,以查看微小的调整如何影响系统的输出。不幸的是,需要加载CoreNLP包才能执行其分类和标记,而且该文件太大,需要几秒钟才能加载到内存中。这看起来似乎没有太多的等待时间,但单元测试本身运行起来需要几毫秒,每次启动新的测试运行时,我都必须等待模型文件加载,这似乎很遗憾


有没有办法加载一次模型文件,然后针对内存中已经存在的模型运行后续的单元测试运行?也许像存储模型并可以从单元测试中调用的测试“服务器”之类的东西?我以前从未处理过这样的事情,所以我真的不知道从哪里开始。

一般来说,如果您使用的是现代操作系统,如Linux,则在短时间内对同一文件的后续读取将被缓存-除非该文件非常大或您的可用内存不足。这不仅仅是理论上的——您可以轻松地运行JUnit测试,并进行一些分析,表明多次加载一个文件将导致除第一次加载外的所有加载速度接近
memcpy
,只要该文件大致适合空闲RAM

也就是说,在现代桌面或服务器硬件上,只要文件在缓存中,它的加载速度通常为5 GB/s或更快。如果文件太大而无法保存在缓存中,那么许多其他解决方案已经被排除在外:因为替代方案,例如守护进程将文件保存在共享内存中,无论如何都需要相同数量的RAM

这都是关于读取文件的原始成本(例如,使用Java的InputStream或其他读取原始文件的类)。“加载”文件的真正成本很可能是您需要进行特定于应用程序的解析,以将文件转换为预期的内存格式。在这种情况下,您当然可以考虑某种类型的长期缓存过程,它将文件存储在java调用中。您可以使用redis或memcached等现成的工具,但您必须确保反序列化方案比解析方案快得多


最终,您需要分析库中有问题文件的加载情况。它是IO受限(即,在IO函数中阻塞的时间最多),还是CPU受限(例如,在解析或其他函数中处理的时间最多)?只有这样,您才能确定需要在什么级别进行缓存才能发挥作用。

在单元测试中,这种情况的典型解决方案是将代码与“干扰”库隔离(即消除依赖关系)或使用双精度缓存(如存根或模拟)。针对实际数据库的单元测试被认为是一种“测试气味”。

在静态方法中加载模型一次。我确实在静态方法中加载模型一次。抱歉,如果我不清楚:我想在每台计算机启动时加载一次模型。基本上,只有第一个套件的运行速度慢,其他所有套件的运行速度都应该快。这有意义吗?我不知道如何最好地表达它。要在运行之间重用数据,您需要将其加载到一个可以在共享内存中使用的表单中。e、 g.内存映射文件。我不确定这是否值得。如果它在整个单元测试运行过程中增加了几秒钟,那么可能不会改变工作。首先要做的是检查基本情况:加载文件所用的代码是什么?你有SSD吗?我实际上已经用JavaRMI拼凑出了一个可行的解决方案。服务器加载文件,然后坐在那里等待来自单元测试的调用。但我不确定这是否理想。我认为这与其说是一种气味,不如说是一种将测试定义为集成测试,而不是单元测试的东西。这不是“坏”,只是另一回事。我不应该把它们混为一谈,因为我完全同意。单元测试在这里不是正确的术语,它实际上是一个集成测试。