我有这个Java代码,它应该读取0.5M文件并在删除一些无用信息后写入(我正在使用安然电子邮件数据集)
public void getInboxFiles(File directory){
File[] usersFolders;
File[] userFolders;
File[] inboxFiles;
usersFolders = directory.listFiles();
for(File temp:usersFolders){
userFolders = temp.listFiles();
for(File temp2:userFolders){
inboxFiles = temp2.listFiles();
for(File tmp3:inboxFiles){
if(tmp3.isDirectory())
continue;
readNPrase(tmp3, new File("/media/ADATA SH12/datasets/parsedEnron/"+temp.getName()+tmp3.getName()+".txt"));
}
}
}
}
函数readNParse是:
public void readNPrase(File in,File out){
BufferedReader br=null;
BufferedWriter bw =null;
try{
br = new BufferedReader(new FileReader(in));
bw= new BufferedWriter(new FileWriter(out));
boolean messageContent = false;
String line = null;
while((line = br.readLine()) != null){
if(line.trim().equals(""))
messageContent = true;
if(messageContent && !isHeader(line) && !line.trim().equals("")){
bw.write(line);
bw.newLine();
}
}
bw.flush();
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
try{
bw.close();
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
运行此代码10分钟后,它停止工作,并给了我这个错误:
java.lang.NullPointerException java.io.FileNotFoundException: /media/ADATA SH12/datasets/parsedEnron/causholli-m98.txt (No space left on device)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
at java.io.FileWriter.<init>(FileWriter.java:90)
at EnronMailParser.readNPrase(EnronMailParser.java:16)
at EnronMailParser.getInboxFiles(EnronMailParser.java:71)
at EnronMailParser.main(EnronMailParser.java:84)
我检查了驱动器上的空间,但是空间太大了 有些人说它与文件名有关,有些人说它与inode有关,这是一个os问题,我不知道它是什么以及如何解决它。我在Ubuntu 12.04上。
答案 0 :(得分:8)
正如您所指出的那样,“设备上没有剩余空间”可能意味着您没有存储新文件的文件系统上的inode。 Unix文件系统(包括Ubuntu)通常对存储在文件系统中的每个文件使用称为 inode 的数据结构。创建文件系统时,inode的数量是固定的,它限制了可以在文件系统中创建的文件数。如果文件系统没有inode,即使有空闲空间,也无法创建新文件。
您可以运行df -i
来查看每个文件系统有多少个inode以及有多少inode。
文件系统通常是用大量的inode创建的,因此用完它有点不寻常。文件系统上可能有大量非常小或空的文件。发现一些程序在一些不起眼的目录中悄悄地创建空文件并不罕见。您应该检查文件系统以查看是否有一些文件可以删除。请记住,您正在寻找要删除的大型数字文件,因为您要释放大量的inode。每个文件的大小并不重要。
如果文件系统没有inode,那么在程序中你可以做很多事情来解决这个问题。如果您的程序是创建一堆空文件的程序,那么您应该重新考虑程序的工作方式。否则,您唯一的选择是在其他地方创建文件,其中inode不是问题。
答案 1 :(得分:4)
大多数文件系统对可以在单个目录中的文件数量有限制。我猜你正在达到这个极限。我建议添加一些级别的目录嵌套,以便所有结果文件不会在同一目录中。这里有一些限制信息:https://stackoverflow.com/a/466596/552759。