Auf dem SFTP-Server liegen über 500000 Dateien, die verarbeitet werden müssen, also pro Datei müssen 25000 zusammengefügt werden.
Ich habe mich für Thread entschieden, aber es ist sehr langsam, hätte jemand Optimierungsvorschläge? Im Umgang mit Thread bin ich so zu sagen Anfänger.
Mit besten Grüßen
Ich habe mich für Thread entschieden, aber es ist sehr langsam, hätte jemand Optimierungsvorschläge? Im Umgang mit Thread bin ich so zu sagen Anfänger.
Mit besten Grüßen
Java:
Vector<ChannelSftp.LsEntry> entries = sftp.ls(SOURCE);
Lock sftpLock = new ReentrantLock();
int numThreads = 4;
int filesPerThread = entries.size() / numThreads;
int remainingFiles = entries.size() % numThreads;
Thread thread1 = new Thread(() -> {
int startIndex = 0;
int endIndex = filesPerThread;
processXML(startIndex, endIndex, entries, sftp, sftpLock, xmlReadWriter111);
});
Thread thread2 = new Thread(() -> {
int startIndex = filesPerThread;
int endIndex = startIndex + filesPerThread;
processXML(startIndex, endIndex, entries, sftp, sftpLock, xmlReadWriter111);
});
Thread thread3 = new Thread(() -> {
int startIndex = 2 * filesPerThread;
int endIndex = startIndex + filesPerThread;
processXML(startIndex, endIndex, entries, sftp, sftpLock, xmlReadWriter111);
});
Thread thread4 = new Thread(() -> {
int startIndex = 3 * filesPerThread;
int endIndex = startIndex + filesPerThread + remainingFiles;
processXML(startIndex, endIndex, entries, sftp, sftpLock, xmlReadWriter111);
});
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread1.join();
thread2.join();
thread3.join();
thread4.join();
sftp.disconnect();
session.disconnect();
}
private static void processXML(int startIndex, int endIndex, Vector<ChannelSftp.LsEntry> entries, ChannelSftp sftp,
Lock sftpLock, XMLReadWriter111 xmlReadWriter111) {
List<Document> materials = new ArrayList<>();
List<Document> erp_mark = new ArrayList<>();
List<Document> crossreference = new ArrayList<>();
List<Document> dokuinfosatz = new ArrayList<>();
for (int k = startIndex; k < endIndex; k++) {
ChannelSftp.LsEntry entry = entries.get(k);
//Material"
if (!entry.getAttrs().isDir() && entry.getFilename().startsWith("Material")) {
String remoteFile = SOURCE + entry.getFilename();
System.out.println(Thread.currentThread().getName() + " :" + k);
try {
sftpLock.lock();
materials.add(parseXml(sftp.get(remoteFile)));
} catch (SftpException e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (materials.size() == 25000 && !materials.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(materials,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.PRODUCTS.value());
materials.clear();
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
//ERP_MARKE
if (!entry.getAttrs().isDir() && entry.getFilename().startsWith("ERP_MARKE")) {
String remoteFile = SOURCE + entry.getFilename();
System.out.println("B " + k);
try {
sftpLock.lock();
erp_mark.add(parseXml(sftp.get(remoteFile)));
} catch (SftpException e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (erp_mark.size() == 25000 && !erp_mark.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(erp_mark,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.PRODUCTS.value());
erp_mark.clear();
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
//Crossreference
if (!entry.getAttrs().isDir() && entry.getFilename().startsWith("Crossreference")) {
String remoteFile = SOURCE + entry.getFilename();
System.out.println("Crossreference " + k);
try {
sftpLock.lock();
crossreference.add(parseXml(sftp.get(remoteFile)));
} catch (SftpException e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (crossreference.size() == 25000 && !crossreference.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(crossreference,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.PRODUCTS.value());
erp_mark.clear();
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
//Dokuinfosatz
if (!entry.getAttrs().isDir() && entry.getFilename().startsWith("Dokuinfosatz")) {
String remoteFile = SOURCE + entry.getFilename();
System.out.println("Dokuinfosatz" + k);
try {
sftpLock.lock();
dokuinfosatz.add(parseXml(sftp.get(remoteFile)));
} catch (SftpException e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (dokuinfosatz.size() == 25000 && !dokuinfosatz.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(dokuinfosatz,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.ASSETS.value());
erp_mark.clear();
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
}
if (!materials.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(materials,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.PRODUCTS.value());
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (!erp_mark.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(erp_mark,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.PRODUCTS.value());
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (!crossreference.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(crossreference,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.PRODUCTS.value());
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
if (!dokuinfosatz.isEmpty()) {
try {
sftpLock.lock();
xmlReadWriter111.createOneXMLFile(dokuinfosatz,
"C:\\Users\\test\\IdeaProjects\\XMLDateien\\xml", Tags.ASSETS.value());
} catch (Exception e) {
e.printStackTrace();
} finally {
sftpLock.unlock();
}
}
}