我在StackOverflow上看到一些彼此矛盾的帖子,我想得到一个明确的答案。
我开始假设使用Java InputStream将允许我从文件中流式传输字节,从而节省内存,因为我不必一次消耗整个文件。这正是我在这里阅读的内容:
将所有字节加载到内存不是一个好习惯。考虑返回文件并打开输入流以读取它,因此在处理大文件时应用程序不会崩溃。–安德鲁兹
但是后来我使用InputStream读取了一个非常大的Microsoft Excel文件(使用Apache POI库),然后遇到了这个错误:
使用POI读取Excel文件(xlsx)时出现java.lang.outofmemory异常
我收到一个OutOfMemory错误。
这些至关重要的建议为我节省了:
一开始会有所不同的事情是打开文件时。如果您有文件,则将其传递!使用InputStream需要将所有内容缓冲到内存中,这会占用空间。由于您不需要进行缓冲,所以不用!
我摆脱了InputStream,只使用了裸露的java.io.File,然后OutOfMemory错误消失了。
因此,就内存使用而言,使用java.io.File比InputSteam更好?那没有任何意义。
真正的答案是什么?
我很好奇使用Big O Notation描述这个的官方方式是什么?
var prices = [100, 180, 260, 590, 40, 310, 535, 10, 5, 3];
var biggest_profit = 0;
for (var i=0; i < prices.length; i++) {
var first_price = prices[i];
for (var j=i+1; j <= prices.length; j++) {
// do something here
}
}
Run Code Online (Sandbox Code Playgroud)
这有点让我失望:
j=i+1
Run Code Online (Sandbox Code Playgroud)
每次我们经历i
,j
变得越来越短.
Big O Notation中此模式的正确名称是什么?