получить скорость записи каждую секунду при создании файла в Python / Java - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь создать большой файл, скажем, 5/10 ГБ.Но мне нужно показывать скорость записи каждую секунду.Примерно так

783441920 bytes (783 MB, 747 MiB) copied, 1 s, 783 MB/s
1088824320 bytes (1.1 GB, 1.0 GiB) copied, 2 s, 544 MB/s
1390494720 bytes (1.4 GB, 1.3 GiB) copied, 3 s, 462 MB/s
1602211840 bytes (1.6 GB, 1.5 GiB) copied, 4 s, 399 MB/s
1678894080 bytes (1.7 GB, 1.6 GiB) copied, 5 s, 312 MB/s
1850752000 bytes (1.9 GB, 1.7 GiB) copied, 6 s, 308 MB/s
2023480320 bytes (2.0 GB, 1.9 GiB) copied, 7 s, 288 MB/s
2195302400 bytes (2.2 GB, 2.0 GiB) copied, 8 s, 274 MB/s
2363176960 bytes (2.4 GB, 2.2 GiB) copied, 9 s, 262 MB/s

Но я не могу найти способ получить скорость за каждую секунду.(Я не могу использовать dd command, мне нужно создать файл вручную в Python или Java)

Ответы [ 2 ]

1 голос
/ 17 марта 2019

В Java нет способа получить скорость записи, вы должны реализовать это самостоятельно. Вот пример, который записывает файл размером 5 ГБ и выводит процесс примерно каждую секунду.

Он записывает блоки размером 1 КБ, считает записанные блоки и, если с начала или после того, как последний вывод получен, выводится текущая статистика

int blockCount = 1024 * 1024 * 5;
int blockSize = 1024;
// sums up to 5 GB
byte[] bytes = new byte[blockSize];
new SecureRandom().nextBytes(bytes); // generates some random data
FileOutputStream fos = new FileOutputStream(new File("/path/to/your/file"));
long blocksWritten = 0;
long blocksWrittenLastSecond = 0;
long timer = System.currentTimeMillis();
for (int i = 0; i < blockCount; i++) {
    fos.write(bytes);
    blocksWrittenLastSecond++;
    long now = System.currentTimeMillis();
    long timerDelay = now - timer;
    if (timerDelay >= 1000 || i == blockCount - 1) {
        blocksWritten += blocksWrittenLastSecond;
        long bytesWrittenTotal = blockSize * blocksWritten;
        long bytesWrittenLastSecond = blockSize * blocksWrittenLastSecond;
        double currentMegaBytesPerSecond = (double) (bytesWrittenLastSecond / (1024 * 1024)) / (timerDelay / 1000d);
        System.out.println(bytesWrittenTotal + " bytes written with " + Math.round(currentMegaBytesPerSecond) + " mb/s");
        // reset for next second
        blocksWrittenLastSecond = 0;
        timer = System.currentTimeMillis();
    }
}
fos.close();

Это вывод для моего старого жесткого диска:

262943744 bytes written with 250 mb/s
638312448 bytes written with 357 mb/s
1021830144 bytes written with 365 mb/s
1395726336 bytes written with 356 mb/s
1425204224 bytes written with 10 mb/s
1459958784 bytes written with 6 mb/s
1512032256 bytes written with 49 mb/s
1876321280 bytes written with 347 mb/s
2250982400 bytes written with 357 mb/s
2563824640 bytes written with 298 mb/s
2879109120 bytes written with 300 mb/s
3191470080 bytes written with 297 mb/s
3417269248 bytes written with 215 mb/s
3644478464 bytes written with 215 mb/s
3674432512 bytes written with 6 mb/s
3776074752 bytes written with 22 mb/s
4130227200 bytes written with 337 mb/s
4482337792 bytes written with 335 mb/s
4830609408 bytes written with 332 mb/s
5181122560 bytes written with 334 mb/s
5368709120 bytes written with 221 mb/s

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

1 голос
/ 17 марта 2019

Java не предлагает getWriteSpeed ​​() или что-то в этом роде.Но, предполагая, что вы пишете этот файл, используя FileOutputStream, попробуйте не записывать все данные сразу, а разбить ваши данные на куски, например.1024 байта и получить время до всей операции записи и после каждого вызова write () (и, если необходимо, flush ()) в поток с помощью System.currentTimeMillis ()

Ваша скорость записи будет (chunksWritten * 1024)) / ((currentTime - writeStartTime) / 1000d) в байтах / сек.

Затем каждую секунду вы можете вывести это значение.Чтобы обнаружить новую секунду, вы можете сохранить результат currentTime% 1000 (остаток от деления на 1000) и проверить каждый цикл записи, не меньше ли он предыдущего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...