#java #multithreading #mongodb #csv #java-io
#java #многопоточность #mongodb #csv #java-io
Вопрос:
У меня огромные данные (миллионы записей) в mongo-db. Мне нужно прочитать данные из одной коллекции, затем выполнить некоторый процесс фильтрации, а затем снова сопоставить данные из другой коллекции в mongo-db. Мне нужно отобразить данные в файле csv (здесь я использую CsvWriter
), я могу сделать это как отдельную программу / процесс, но это занимает много времени (5-6 часов). Я хочу использовать потоки.
Мое требование таково:
Предположим, если у меня есть 1000000 записей в БД, то 20 потоков должны распределяться по 5 кб на поток. Если имеется 2000000 записей, то по 10 кб на поток. А также можем ли мы передавать данные в файл csv с помощью CsvWriter
одновременного использования 20 потоков?
Комментарии:
1. Если «фильтрация» является узким местом, то может помочь добавление дополнительных потоков, но если узким местом является ввод-вывод, то потоки вообще не помогут. Вы пробовали профилировать свою программу, чтобы выяснить, на что она тратит свое время?
2. да, после завершения фильтрации требуется больше времени, т. Е. получение сопоставленных данных из базы данных и отправка данных в файл csv
3. Я бы предложил создать 20 временных csv-файлов, присвоив каждый файл одному потоку, а затем объединить их вместе после извлечения всех данных. Многопоточность — это боль, и часто она того не стоит, если данные поступают небольшими порциями. Многопоточность имеет смысл, только если каждая операция фильтрации занимает более 250-500 мс. Если данные должны быть упорядочены, добавьте идентификатор к каждой записи во временных файлах и используйте это для сортировки объединенного файла. Затем удалите идентификатор.
4. @Sat Что вы в итоге использовали? Я должен сделать что-то подобное, и я хотел бы знать, что сработало у вас.