Hallo Zusammen,
ich habe hier ein Problem, dass ich nicht ganz verstehe.
Ich habe folgendes Programm:
Das Programm prüft, ob eine bestimmte Datei schon in einer Datenbank enthalten ist. Wenn dem nicht so ist, schreibt es sie rein. Das passiert in einer separaten Klasse (DirSlicer).
Mein Problem ist, dass das Programm Unmengen an Speicher frisst. Bei einem Verzeichnisbaum mit ca. 3.000 Dateien bin ich nach dem Durchlauf bei ca. 200 MByte Speicher, die belegt werden.
Dieser Speicherverbauch resultiert aus der Methode FileEntry soweit konnte ich es eingrenzen. Warum diese Methode so viele Ressourcen frisst ist mir allerdings nicht klar. Zur Eingrenzung habe ich das Aufrufen der Klasse "DirSlicer" deaktiviert, die Ressourcen werden nicht dort verbraucht.
Es wird eine Verbindung aufgebaut, ein Statment erzeugt, ein Resultset geladen. Am Ende der Methode wird das alles wieder geschlossen. Damit müssten doch die Ressourcen wieder freigegeben werden, oder?
Hat jemand eine Idee?
Viele Grüße,
Sebix
ich habe hier ein Problem, dass ich nicht ganz verstehe.
Ich habe folgendes Programm:
Java:
public class DirCrawler {
static Connection con2;
static Statement stmt2;
static ResultSet rs2;
static String directory, user, pw, server, database, fileconsole;
static File startdir;
static File appdir;
static DIRSlicer slicer = new DIRSlicer();
static int filecount=0;
static String partpath;
private static void readconfig(){
Properties properties = new Properties();
BufferedInputStream stream;
try {
stream = new BufferedInputStream(new FileInputStream(startdir.getPath()+"/config.ini"));
properties.load(stream);
stream.close();
server = properties.getProperty("server");
user = properties.getProperty("user");
pw = properties.getProperty("pw");
directory = properties.getProperty("dir");
database = properties.getProperty("database");
fileconsole = properties.getProperty("fileconsole");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void FileEntry(Path path) {
try {
Class.forName("com.mysql.jdbc.Driver");
filecount++;
con2 = DriverManager.getConnection("jdbc:mysql://"+DirCrawler.server+"/"+DirCrawler.database+"?user="+DirCrawler.user+"&password="+DirCrawler.pw);
stmt2 = con2.createStatement();
rs2 = stmt2.executeQuery("SELECT * FROM `absolut_path` WHERE `filepath` = \""+path+"\"");
if(rs2.next()){
System.out.println("Vorhandene Dateien: " + filecount);
} else {
// slicer.slicer(path, false);
}
con2.close();
stmt2.close();
rs2.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
System.out.println(e.toString());
}
}
private static void crawler(final Path start) throws IOException {
// crawl directory and sub-directories
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFileFailed(Path file,
IOException exc) {
System.err.println(exc);
return FileVisitResult.CONTINUE;
}
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException
{
File[] files = dir.toFile().listFiles();
if (files != null) { // Erforderliche Berechtigungen etc. sind vorhanden
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
}
else {
partpath=files[i].toString().substring(3);
if(partpath.indexOf("\\")<0){
System.out.println("Datei im Laufwerksroot werden nicht berücksichtigt");
} else {
if(partpath.substring(0, 1).equals("$")){
System.out.println("Systemverzeichnis wird übersprungen!");
}
else {
FileEntry(files[i].toPath());
}
}
}
}
}
return FileVisitResult.CONTINUE;
}
});
WatchDir watcher = new WatchDir();
watcher.processEvents();
}
public static void init(Class<?> mainClass) {
// System.out.println("Starte Verzeichnisermittlung");
String userdir = System.getProperty("user.dir");
startdir = new File(userdir);
String mainResName = mainClass.getSimpleName()+".class";
URL mainRes = mainClass.getResource(mainResName);
if(!mainRes.getProtocol().equals("jar")) {
// don't know what to do. use startdir.
appdir = startdir;
return;
}
String mainLocator = mainRes.getPath();
String jarpart = mainLocator.substring(0,
mainLocator.lastIndexOf("!/"));
File jarfile;
try
{
jarfile = new File(new URI(jarpart));
appdir = jarfile.getParentFile();
}
catch(URISyntaxException ex)
{
// should not happen. actually.
Logger.getLogger(DirectoryManager.class.getName()).log(
Level.SEVERE, null, ex);
appdir = startdir;
}
}
public static void main(String[] args) throws IOException {
init(WatchDir.class);
readconfig();
if (fileconsole.equals("true")){
File file = new File(startdir+"/java.log");
try {
System.setOut(new PrintStream(new FileOutputStream(file,true)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Path dir = Paths.get(directory);
crawler(dir);
}
}
Das Programm prüft, ob eine bestimmte Datei schon in einer Datenbank enthalten ist. Wenn dem nicht so ist, schreibt es sie rein. Das passiert in einer separaten Klasse (DirSlicer).
Mein Problem ist, dass das Programm Unmengen an Speicher frisst. Bei einem Verzeichnisbaum mit ca. 3.000 Dateien bin ich nach dem Durchlauf bei ca. 200 MByte Speicher, die belegt werden.
Dieser Speicherverbauch resultiert aus der Methode FileEntry soweit konnte ich es eingrenzen. Warum diese Methode so viele Ressourcen frisst ist mir allerdings nicht klar. Zur Eingrenzung habe ich das Aufrufen der Klasse "DirSlicer" deaktiviert, die Ressourcen werden nicht dort verbraucht.
Es wird eine Verbindung aufgebaut, ein Statment erzeugt, ein Resultset geladen. Am Ende der Methode wird das alles wieder geschlossen. Damit müssten doch die Ressourcen wieder freigegeben werden, oder?
Hat jemand eine Idee?
Viele Grüße,
Sebix
Zuletzt bearbeitet: