【发布时间】:2014-03-10 17:46:05
【问题描述】:
我现在正在进行的优化项目之一广泛使用EPANet。我们反复调用 EPANet 中的两种模拟方法来了解水如何流经配水网络。
HydraulicSim 是我们使用的类之一。查看重载的simulate 方法:
public void simulate(File hyd) throws ENException {
...
}
public void simulate(OutputStream out) throws ENException, IOException {
...
}
public void simulate(DataOutput out) throws ENException, IOException {
...
}
我们使用的另一个类是QualitySim。在这里,我们还使用了重载的simulate 方法:
public void simulate(File hydFile, File qualFile) throws IOException, ENException {
...
}
void simulate(File hydFile, OutputStream out) throws IOException, ENException {
...
}
这是我们目前正在做的事情:
- 创建两个
File对象hydFile和qualFile。 - 拨打
HydraulicSim.simulatehydFile。 - 在
hydFile和qualFile上致电QualitySim.simulate。 - 删除文件。
问题是我们必须这样做很多次。对于一个大问题,我们可以这样做几十万甚至几百万次。您可以想象重复创建/写入/删除这些文件会导致减速。
所以我的问题是:我是否可以创建这些文件,使它们仅驻留在内存中而从不接触磁盘?每个文件都非常小(我说的是几百字节),因此将它们放入内存中不会有问题;我只需要弄清楚如何。我四处搜索并没有真正找到太多,除了MappedByteBuffer,但我不确定如何,或者是否有可能从该类创建File。
欢迎任何建议!
【问题讨论】:
-
向 EPANet 团队提交问题可能是值得的。模拟方法都简单地使用 File 对象来获取输入和输出流。如果他们提供了一个将流作为参数的
QualitySim.simulate方法(它们对输出流而不是输入流执行此操作),您可以绕过FS。或者只是分叉并自己做。 -
可以使用ByteArrayOutputStream和ByteArrayInputStream,但必须预先分配足够大的字节数组。
-
一定要使用文件吗?由于您已经有一些使用 Streams 的函数,因此您可以改用 ByteArrayOutputStream 和 ByteArrayInputStream。
-
@LeonardBrünings QualitySim 类不提供接受输入参数 (hydFile) 流的方法。
-
@MikeB 是的,我看到了,但是正如您已经提到的那样,实施更改将是微不足道的。因此,我只需添加该方法并发出拉取请求以供他们包含它。
标签: java