Ich verwende Dateien.NewDirectoryStream, um eine Verzeichnisstruktur rekursiv zu iterieren. Ich möchte mit einem Ausführungsdienst verwenden, um das Verzeichnis parallel zu erreichen (Dateien sind über eine langsame Netzwerkverbindung und Latenz führt dazu, dass unser ursprünglicher Suchansatz für ein Thread die meiste Zeit blockiert wird).
ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
public void walkDirectory(Path directory) {
try (DirectoryStream stream = Files.newDirectoryStream(directory)) {
for (Path entry : stream) {
DosFileAttributes attribs = getBasicFileAttributes(entry);
if (attribs.isDirectory()) {
executorService.submit(() -> walkDirectory(entry));
} else {
process(entry, attribs);
}
}
}
}
< /code>
Ich muss jetzt blockieren, bis die Iteration abgeschlossen ist. Beachten Sie auch, dass die Threads des Executor -Dienstes Jobs an denselben Executor -Service senden müssen. Besserer /eleganterer Weg, um dieses Parallelisierungsziel zu erreichen? Testen: < /p>
Ich erstelle einen Atomicinteger -Zähler, der die Anzahl der zu Fuß erreichten Verzeichnisse im Auge behält. Wenn dieser Zähler auf Null fällt, wissen wir, dass der Traversal vollständig ist. Das. < /p>
Wenn jemand Feedback hat, würde ich es schätzen, es zu hören. < /p>
public class FolderWalker {
private final ExecutorService executorService;
private final PathProcessor processor;
private final PathFilter fileFilter;
private final PathFilter directoryFilter;
private final ExceptionHandler exceptionHandler;
private final AtomicInteger activeThreads = new AtomicInteger(0);
private final Object lock = new Object();
private boolean keepRunning = true;
public static interface PathProcessor{
public void process(Path p, DosFileAttributes attribs) throws Exception;
}
public static interface ExceptionHandler{
public boolean handle(Path p, Exception e); // return true to continue traversal
}
public static interface PathFilter{
public boolean accept(Path p, DosFileAttributes attribs);
public static PathFilter ACCEPT_ALL = (p, attribs) -> true;
}
public FolderWalker(int numThreads, PathFilter directoryFilter, PathFilter fileFilter, PathProcessor processor, ExceptionHandler exceptionHandler) {
this.executorService = createExecutorService(numThreads);
this.directoryFilter = directoryFilter;
this.fileFilter = fileFilter;
this.processor = processor;
this.exceptionHandler = exceptionHandler;
}
private static ExecutorService createExecutorService(int numThreads) {
// if threads are all in use, then the calling thread has to do the work - this will keep us from having excessive memory overhead of submitted jobs
return new ThreadPoolExecutor(numThreads, numThreads, 0, TimeUnit.MILLISECONDS,
new SynchronousQueue(),
new ThreadPoolExecutor.CallerRunsPolicy());
}
public void walkDirectory(Path directory) {
activeThreads.incrementAndGet();
executorService.submit(() -> walkDirectoryInternal(directory));
}
private void walkDirectoryInternal(Path directory) {
int activeThreadCount = activeThreads.get();
System.out.println(Thread.currentThread() + " - Before: Looking in " + directory + " - Active folders: " + activeThreadCount);
try {
try (DirectoryStream stream = Files.newDirectoryStream(directory)) {
for (Path entry : stream) {
// TODO: How do we want to handle exceptions?
//if (thrownException != null) return;
if (Thread.interrupted()) return;
if (!keepRunning) return;
try {
DosFileAttributes attribs = getBasicFileAttributes(entry);
if (attribs.isDirectory() && directoryFilter.accept(entry, attribs)) {
activeThreads.incrementAndGet();
executorService.submit(() -> walkDirectoryInternal(entry));
} else if (fileFilter.accept(entry, attribs)) {
processor.process(entry, attribs);
}
} catch (Exception e) {
if (!exceptionHandler.handle(entry, e))
keepRunning = false;
}
}
} catch (Exception e) {
if (!exceptionHandler.handle(directory, e))
keepRunning = false;
}
} finally {
activeThreadCount = activeThreads.decrementAndGet();
System.out.println(Thread.currentThread() + " - After: Looking in " + directory + " - Active folders: " + activeThreadCount);
if (activeThreadCount == 0) {
synchronized(lock) {
lock.notifyAll();
}
}
}
}
private DosFileAttributes getBasicFileAttributes(Path p) throws IOException {
return Files.getFileAttributeView(p, DosFileAttributeView.class).readAttributes();
}
public void await() throws Exception {
synchronized(lock) {
while (activeThreads.get() != 0)
lock.wait();
}
executorService.shutdown();
System.out.println("Thread pool is shut down");
try {
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
System.out.println("Thread pool is terminated");
}
}
Ich verwende Dateien.NewDirectoryStream, um eine Verzeichnisstruktur rekursiv zu iterieren. [url=viewtopic.php?t=14917]Ich möchte[/url] mit einem Ausführungsdienst verwenden, um das Verzeichnis parallel zu erreichen (Dateien sind über eine langsame Netzwerkverbindung und Latenz führt dazu, dass unser ursprünglicher Suchansatz für ein Thread die meiste Zeit blockiert wird).[code]ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
public void walkDirectory(Path directory) { try (DirectoryStream stream = Files.newDirectoryStream(directory)) { for (Path entry : stream) {
DosFileAttributes attribs = getBasicFileAttributes(entry); if (attribs.isDirectory()) { executorService.submit(() -> walkDirectory(entry)); } else { process(entry, attribs); } } } } < /code> Ich muss jetzt blockieren, bis die Iteration abgeschlossen ist. Beachten Sie auch, dass die Threads des Executor -Dienstes Jobs an denselben Executor -Service senden müssen. Besserer /eleganterer Weg, um dieses Parallelisierungsziel zu erreichen? Testen: < /p> Ich erstelle einen Atomicinteger -Zähler, der die Anzahl der zu Fuß erreichten Verzeichnisse im Auge behält. Wenn dieser Zähler auf Null fällt, wissen wir, dass der Traversal vollständig ist. Das. < /p> Wenn jemand Feedback hat, würde ich es schätzen, es zu hören. < /p> public class FolderWalker {
private final ExecutorService executorService; private final PathProcessor processor; private final PathFilter fileFilter; private final PathFilter directoryFilter; private final ExceptionHandler exceptionHandler; private final AtomicInteger activeThreads = new AtomicInteger(0); private final Object lock = new Object();
private boolean keepRunning = true;
public static interface PathProcessor{ public void process(Path p, DosFileAttributes attribs) throws Exception; }
public static interface ExceptionHandler{ public boolean handle(Path p, Exception e); // return true to continue traversal }
public static interface PathFilter{ public boolean accept(Path p, DosFileAttributes attribs);
public static PathFilter ACCEPT_ALL = (p, attribs) -> true; }
// if threads are all in use, then the calling thread has to do the work - this will keep us from having excessive memory overhead of submitted jobs return new ThreadPoolExecutor(numThreads, numThreads, 0, TimeUnit.MILLISECONDS, new SynchronousQueue(), new ThreadPoolExecutor.CallerRunsPolicy()); }
public void walkDirectory(Path directory) { activeThreads.incrementAndGet(); executorService.submit(() -> walkDirectoryInternal(directory)); }
private void walkDirectoryInternal(Path directory) { int activeThreadCount = activeThreads.get(); System.out.println(Thread.currentThread() + " - Before: Looking in " + directory + " - Active folders: " + activeThreadCount);
try { try (DirectoryStream stream = Files.newDirectoryStream(directory)) { for (Path entry : stream) { // TODO: How do we want to handle exceptions? //if (thrownException != null) return; if (Thread.interrupted()) return; if (!keepRunning) return;
public void await() throws Exception { synchronized(lock) { while (activeThreads.get() != 0) lock.wait(); }
executorService.shutdown(); System.out.println("Thread pool is shut down"); try { if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { executorService.shutdownNow(); } } catch (InterruptedException e) { executorService.shutdownNow(); } System.out.println("Thread pool is terminated");
Ich habe eine Funktion f (df, x) wobei df ein großer Datenrahmen ist und X eine einfache Variable ist. Die Funktion f wird nur aus df gelesen und ändert sie nicht. Ist es möglich, den Speicher von df...
Ich versuche, eine Python-Datei aus einer Codebasis auszuführen und habe ein Minimalbeispiel erstellt, um das Problem zu erklären, mit dem ich konfrontiert bin.
foo
├── bar
│ ├── burp
│ │ └──...
Ich versuche, React Native in mein bestehendes iOS-Projekt zu integrieren. Meine aktuelle Ordnerstruktur sieht so aus.
|
|-iOS Project
|
|-ReactNative Project
Wenn ich eine for-each-Schleife für eine verknüpfte Liste in Java verwende,
ist dann garantiert, dass ich die Elemente in der Reihenfolge
wiederholen werde, in der sie in der Liste erscheinen?
Die Art dieses Shell -Befehls besteht darin, die Remote -Server -Dateien aufzulisten, sie auf parallel zu leiten und dann vom Remote -Server zum Localhost zu richten, wie hier
zu sehen ist ssh -o...