java много потоков, записывающих случайные байты в файл одновременно [просто нужен совет]

Я пишу простой эталонный тест в java для проверки распараллеливания. Всего программа генерирует 1000 случайных байтов и записывает их в двоичный файл. Он использует различное количество потоков для распараллеливания генерации байтов и записи на диск и измеряет время выполнения всего процесса для каждого количества потоков.

Программа разделяет полностью выполнение между указанным числом потоков — как создание байтовых массивов , так и запись этих байтов в файл.

Моя проблема в том, что мне нужно иметь один двоичный файл в конце. Мне нужен совет, как лучше заставить каждый поток записывать свои мусорные байты в один и тот же файл. Имейте в виду, меня совершенно не волнует, в каком порядке они окажутся. Пока у меня есть три идеи:

1) Должен ли каждый поток создавать экземпляр RandomAccessFile, каждый из которых ссылается на один и тот же пустой файл на диске, и каждый поток записывает в файл, начиная с другого места, чтобы они не перекрывались? Кажется, это лучший способ по-настоящему распараллелить запись на диск.

2) Могу ли я передать каждому потоку ссылку на какой-либо объект буферизованного потока и заставить каждый поток отправлять свой массив байтов в этот поток? Есть ли способ создать объект, который будет просто прослушивать байты и сразу же записывать их в файл в любом порядке, в котором он их получает? Я обеспокоен тем, что наличие одного объекта, собирающего все байты, не будет действительно представлять собой параллельную запись на диск.

3) Должен ли я, чтобы каждый поток записывал свои байты в свой собственный файл, а затем «сливал» свой файл с основным файлом?

Спасибо за ваше время! Мне не нужны подробные примеры кода, просто хочу получить совет, пока я работаю над этим, чтобы указать мне правильное направление.


person beefster    schedule 05.11.2016    source источник


Ответы (1)


Создайте FileOutputStream, получите соответствующий FileChannel и записывайте данные с помощью ByteBuffers.

person kgeorgiy    schedule 05.11.2016