Java 更改内存限制为20mb的大文件
我想删除大txt文件中的重复编号,其中第一行是行中已排序的编号,但内存限制为20 mb。我读了这篇文章,并尝试使用BufferedWriter,但这个过程需要超过20MB。 请帮帮我Java 更改内存限制为20mb的大文件,java,memory,io,nio,large-files,Java,Memory,Io,Nio,Large Files,我想删除大txt文件中的重复编号,其中第一行是行中已排序的编号,但内存限制为20 mb。我读了这篇文章,并尝试使用BufferedWriter,但这个过程需要超过20MB。 请帮帮我 import java.io.*; import java.util.Scanner; public class DeleteRepeatingNumbers { public static void main(String[] args) throws IOException {
import java.io.*;
import java.util.Scanner;
public class DeleteRepeatingNumbers {
public static void main(String[] args) throws IOException {
try (Scanner sc = new Scanner(
new FileInputStream("input.txt"), "UTF-8");
Writer writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("output.txt"), "utf-8"))) {
int n = sc.nextInt();
int prevInt = 0;
if (n != 0) {
prevInt = sc.nextInt();
writer.write(String.valueOf(prevInt));
}
for (int i = 0; i < n - 1; i++) {
int next = sc.nextInt();
if (next != prevInt) {
writer.write(System.getProperty("line.separator"));
writer.write(String.valueOf(next));
prevInt = next;
}
}
}
}
}
我不确定20mb是否足以启动JVM,但从程序的角度来看,我们可以通过以下方式减少内存占用 这个问题有两种解决方案:
希望这有帮助。我不确定20mb是否足以启动JVM,但从程序的角度来看,我们可以通过以下方式减少内存占用 这个问题有两种解决方案:
希望这有帮助。如果您能向我展示您的资源,我可以更有效地帮助您。但我想你可以先试试这个
公共类删除重复编号{
公共静态void deleteRepeatingNumber(){
StringBuilder sb=新的StringBuilder();
try(Scanner sc=new Scanner(新文件输入流(“resources\\RepeatingNumberTest.txt”),“UTF-8”)){
Set dontRepeatedNumbers=new HashSet();
while(sc.hasNext()){
DontRepeatedNumber.add(sc.nextInt());
}
dontRepeatedNumbers.stream().forEach((整数)->{
sb.append(String.valueOf(number));
sb.append(System.getProperty(“line.separator”);
});
}捕获(IOE异常){
系统输出打印ln(e);
}
try(Writer Writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream)(“resources\\RepeatingNumberTest\u Output.txt”),“utf-8”)){
写(某人写的东西);
}捕获(IOE异常){
系统输出打印ln(e);
}
}
}
如果您能向我展示您的资源,我可以更有效地帮助您。但我想你可以先试试这个
公共类删除重复编号{
公共静态void deleteRepeatingNumber(){
StringBuilder sb=新的StringBuilder();
try(Scanner sc=new Scanner(新文件输入流(“resources\\RepeatingNumberTest.txt”),“UTF-8”)){
Set dontRepeatedNumbers=new HashSet();
while(sc.hasNext()){
DontRepeatedNumber.add(sc.nextInt());
}
dontRepeatedNumbers.stream().forEach((整数)->{
sb.append(String.valueOf(number));
sb.append(System.getProperty(“line.separator”);
});
}捕获(IOE异常){
系统输出打印ln(e);
}
try(Writer Writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream)(“resources\\RepeatingNumberTest\u Output.txt”),“utf-8”)){
写(某人写的东西);
}捕获(IOE异常){
系统输出打印ln(e);
}
}
}
20mb用于整个jvm?这将是困难的。如何启动jvm,会发生哪种错误?它仅用于缓冲区,在哪里使用的内存超过20mb?我不明白你的问题你在哪里看到超过20mb的数据被使用?我不明白你的问题是整个jvm的20MB?这将是困难的。如何启动jvm,会发生哪种错误?它仅用于缓冲区,在哪里使用的内存超过20mb?我不明白你的问题你在哪里看到超过20mb的数据被使用?我不明白你的问题。谢谢你花时间。我添加了删除if(sc.hasNext())sc.nextInt()的第一行,并没有在第一行中添加分隔符:Iterator iter=dontRepeatedNumbers.Iterator();如果(iter.hasNext()){sb.append(iter.next());iter.remove();}但这也需要超过20MB。而且我忘了写第一行是排序数。例如:21 2 4 8 8 9 11 11 11 11 13 14 15 16 222 222 222 222 222 222 222在我看来,您可以通过将缓冲区分成两部分来减少缓冲区大小。首先,您读取文件,执行逻辑,并将结果放入一个字符串生成器。然后将字符串生成器中的所有数据写入输出文件。我认为这将减少大量的缓冲区大小。但是关于限制(20MB),这取决于您的输入。谢谢您花时间。我添加了删除if(sc.hasNext())sc.nextInt()的第一行,并没有在第一行中添加分隔符:Iterator iter=dontRepeatedNumbers.Iterator();如果(iter.hasNext()){sb.append(iter.next());iter.remove();}但这也需要超过20MB。而且我忘了写第一行是排序数。例如:21248889111111111131415162222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
21
2
4
8
8
8
9
11
11
11
11
11
11
13
14
15
16
222
222
222
222
222