Я пытаюсь переписать приложение C# на Spring Boot Java. Приложение C# создает около 150 больших файлов с помощью Parallel.ForEach
и завершается менее чем за 8 минут, тогда как приложение Java занимает около 20 минут
Parallel.ForEach(
_ClientFileList,
new ParallelOptions() { MaxDegreeOfParallelism = FileCreation_ThreadQuantity },
x => CreateFile(x)
);
Программа сначала вызывает хранимую процедуру, которая возвращает набор результатов с информацией, необходимой для создания файла. Каждая строка результирующего набора содержит идентификатор файла, путь для сохранения файла и имя (другой процедуры хранения), которая получает
данные для помещения в файл. Каждая строка этого набора результатов сохраняется в объекте ClientFile, добавленном в список, который называется client_file_info.
Методprocess() затем берет время из списка и вызывает каждую хранимую процедуру (которая и записывает данные, возвращаемые
хранимой процедурой, по указанному пути.
Вот метод Process(), использующий BufferedWriter.
public void process(ClientFile client_file)
{
BufferedWriter writer = new BufferedWriter(new FileWriter(exportFile.FileDestination), 65536); //65536 32768
BufferedWriter ftpWriter = new BufferedWriter(new FileWriter(exportFile.FTPDestination), 65536);
CallableStatement callableStatement = connection.prepareCall("call getInfo (?) }")
int i = 0;
callableStatement.setString(++i, client_file.id);
ResultSet files = ResultSet rs = callableStatement.getResultSet();
if(files != null)
{
while(files.next())
{
writer.write
}
}
}
Я пробовал использовать ParallelStream() и CompletableFutures в методе run() следующим образом, но это занимает около 30 минут, что
столько же времени потребовалось до добавления «многопоточность». Я не обозначил методprocess()
private ClientFile client_file;
private List client_file_list = new ArrayList();
public void run(String... args) {
client_file_list = getClientFileList();
client_file_list.parallelStream().forEach(x -> { client_file.process(x); } );
}
CompletableFuture future = CompletableFuture.runAsync(() -> {
client_file_info.forEach( x -> {client_file.process(x); });
});
@Bean(name = "asyncExecutor")
public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(15);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(2050);
executor.setThreadNamePrefix("poolThread-");
executor.initialize();
return executor; }
Подробнее здесь: https://stackoverflow.com/questions/790 ... ltaneously
Одновременное создание нескольких файлов ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Одновременное создание нескольких конфигураций проекта C# с помощью переменных .csproj.
Anonymous » » в форуме C# - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-