# CrystalDiskMark-Parser
![CI workflow](https://github.com/soerenmetje/CrystalDiskMark-Parser/actions/workflows/main.yml/badge.svg)
Read in the .txt files generated by [CrystalDiskMark](https://en.wikipedia.org/wiki/CrystalDiskMark) in Python.
This library was created to enable visualizing the benchmark results of
[CrystalDiskMark](https://en.wikipedia.org/wiki/CrystalDiskMark) in an automated way.
The following plot created with [matplotlib](https://pypi.org/project/matplotlib/) is an example.
![Example Plot Benchmark](examples/plots/example3.png)
## Install
```shell
pip install crystaldiskmark-parser
```
See https://pypi.org/project/crystaldiskmark-parser/ for more information.
## Overview
The library provides two Functions:
- `parse(filepath)`: Returns parsed data as a `crystaldiskmark_parser.BenchmarkResult`
- `parse_df(filepath)`: Returns parsed data as a `pandas.DataFrame`
Using `parse_df(filepath)` is recommended.
## Example 0: Print DataFrame
```python
from crystaldiskmark_parser.parser import parse_df
df = parse_df("../test/data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt")
print(df)
```
### Output
```
date test \
0 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
1 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
2 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
3 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
4 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
5 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
6 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
7 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)]
time os \
0 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
1 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
2 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
3 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
4 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
5 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
6 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
7 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64)
mode profile comment read_write type blocksize unit_blocksize \
0 [Admin] Default WD Blue 3D 1TB read SEQ 1.0 MiB
1 [Admin] Default WD Blue 3D 1TB read SEQ 1.0 MiB
2 [Admin] Default WD Blue 3D 1TB read RND 4.0 KiB
3 [Admin] Default WD Blue 3D 1TB read RND 4.0 KiB
4 [Admin] Default WD Blue 3D 1TB write SEQ 1.0 MiB
5 [Admin] Default WD Blue 3D 1TB write SEQ 1.0 MiB
6 [Admin] Default WD Blue 3D 1TB write RND 4.0 KiB
7 [Admin] Default WD Blue 3D 1TB write RND 4.0 KiB
queues threads rate unit_rate iops unit_iops latency unit_latency
0 8 1 531.458 MB/s 506.8 IOPS 15726.77 us
1 1 1 489.838 MB/s 467.1 IOPS 2139.41 us
2 32 1 269.406 MB/s 65772.9 IOPS 470.58 us
3 1 1 41.375 MB/s 10101.3 IOPS 98.75 us
4 8 1 498.656 MB/s 475.6 IOPS 16750.30 us
5 1 1 485.163 MB/s 462.7 IOPS 2159.18 us
6 32 1 222.691 MB/s 54367.9 IOPS 583.02 us
7 1 1 99.900 MB/s 24389.6 IOPS 40.73 us
```
## Example 1: Visualize benchmark results
```python
from crystaldiskmark_parser.parser import parse_df
import matplotlib.pyplot as plt
# Read to one big DataFrame
df = parse_df("../test/data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt")
df = df.append(parse_df("../test/data/CrystalDiskMark_20210622163451 SAMSUNG 840 EVO 120GB.txt"))
df = df.append(parse_df("../test/data/CrystalDiskMark_20210626154221 Crucial P2 2TB on H87M.txt"))
df = df.append(parse_df("../test/data/CrystalDiskMark_20210627172807 Crucial P2 2TB on X370.txt"))
print(df.info())
# Extract relevant rows
data = df.loc[(df['read_write'] == 'read')
& (df['type'] == "SEQ")
& (df['queues'] == 8)
& (df['blocksize'] == 1)
& (df['unit_blocksize'] == "MiB")]
# Extract relevant columns
rate = data["rate"]
name = data["comment"]
# Plot
fig, ax = plt.subplots(figsize=(10, 6))
con = ax.bar(name, rate)
ax.bar_label(con)
ax.set_title("Sequential Read Rate of SSDs")
ax.set_ylabel("Rate [MB/s]")
plt.show()
```
![Example Plot Benchmark](examples/plots/example1.png)
## Example 2: Visualize benchmark results (extended)
```python
from crystaldiskmark_parser.parser import parse_df
import matplotlib.pyplot as plt
#%%
# Read to one big DataFrame
df = parse_df("../test/data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt")
df = df.append(parse_df("../test/data/CrystalDiskMark_20210622163451 SAMSUNG 840 EVO 120GB.txt"))
df = df.append(parse_df("../test/data/CrystalDiskMark_20210626154221 Crucial P2 2TB on H87M.txt"))
df = df.append(parse_df("../test/data/CrystalDiskMark_20210627172807 Crucial P2 2TB on X370.txt"))
# Extract relevant rows
data = df.loc[(df['read_write'] == 'read')
& (df['type'] == "SEQ")
& (df['queues'] == 8)
& (df['blocksize'] == 1)
& (df['unit_blocksize'] == "MiB")]
# Extract relevant columns
read_rate = data["rate"]
read_rate = [round(x) for x in read_rate]
name = data["comment"]
# Extract relevant rows
data = df.loc[(df['read_write'] == 'write')
& (df['type'] == "SEQ")
& (df['queues'] == 8)
& (df['blocksize'] == 1)
& (df['unit_blocksize'] == "MiB")]
# Extract relevant columns
write_rate = data["rate"]
write_rate = [round(x) for x in write_rate]
# Plot
fig, ax = plt.subplots(figsize=(12, 6))
con = ax.bar([float(x) + .25 for x in range(len(read_rate))], read_rate, tick_label=name, width = 0.25)
ax.bar_label(con)
con = ax.bar([float(x) + .5 for x in range(len(write_rate))], write_rate, width = 0.25)
ax.bar_label(con)
ax.set_title("Sequential Read & Write Rate of SSDs")
ax.set_ylabel("Rate [MB/s]")
plt.legend(["read", "write"])
plt.show()
```
![Example Plot Benchmark](examples/plots/example3.png)
## Example 3: Visualize benchmark results (without DataFrame)
```python
from crystaldiskmark_parser.parser import parse
import matplotlib.pyplot as plt
result_wd = parse("data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt")
result_samsung = parse("data/CrystalDiskMark_20210622163451 SAMSUNG 840 EVO 120GB.txt")
data = [result_wd.read_results[0].rate, result_samsung.read_results[0].rate]
fig, ax = plt.subplots(figsize=(10,6))
con = ax.bar(["WD Blue 3D 1TB", "Samsung 840 EVO 120GB"], data)
ax.bar_label(con)
ax.set_title("Read Rate of SSDs")
ax.set_ylabel(f"Rate [{result_wd.read_results[0].unit_rate}]")
plt.show()
```
![Example Plot Benchmark](examples/plots/example0.png)
## Example 4: Print BenchmarkResult
```python
from crystaldiskmark_parser.parser import parse
benchmark_result = parse("data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt")
print(benchmark_result)
```
### Output
```
BenchmarkResult({'test': '1 GiB (x5) [E: 96% (894/932GiB)]', 'date': '2021/06/22 17:19:21', 'os': 'Windows 10 [10.0 Build 19042] (x64)', 'profile': 'Default', 'time': 'Measure 5 sec / Interval 5 sec', 'mode': '[Admin]', 'comment': 'WD Blue 3D 1TB WDS100T2B0A', 'write_results': [TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 8, 'threads': 1, 'rate': 498.656, 'unit_rate': 'MB/s', 'iops': 475.6, 'unit_iops': 'IOPS', 'latency': 16750.3, 'unit_latency': 'us'}), TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 1, 'threads': 1, 'rate': 485.163, 'unit_rate': 'MB/s', 'iops': 462.7, 'unit_iops': 'IOPS', 'latency': 2159.18, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 32, 'threads': 1, 'rate': 222.691, 'unit_rate': 'MB/s', 'iops': 54367.9, 'unit_iops': 'IOPS', 'latency': 583.02, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 1, 'threads': 1, 'rate': 99.9, 'unit_rate': 'MB/s', 'iops': 24389.6, 'unit_iops': 'IOPS', 'latency': 40.73, 'unit_latency': 'us'})], 'read_results': [TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 8, 'threads': 1, 'rate': 531.458, 'unit_rate': 'MB/s', 'iops': 506.8, 'unit_iops': 'IOPS', 'latency': 15726.77, 'unit_latency': 'us'}), TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 1, 'threads': 1, 'rate': 489.838, 'unit_rate': 'MB/s', 'iops': 467.1, 'unit_iops': 'IOPS', 'latency': 2139.41, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 32, 'threads': 1, 'rate': 269.406, 'unit_rate': 'MB/s', 'iops': 65772.9, 'unit_iops': 'IOPS', 'latency': 470.58, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 1, 'threads': 1, 'rate': 41.375, 'unit_rate': 'MB/s', 'iops': 10101.3, 'unit_iops': 'IOPS', 'latency': 98.75, 'unit_latency': 'us'})]})
```
## Development
### Build and Publish a New Release
This repository has a GH Actions CI/CD pipeline that handle building and publishing the package to PyPI.
It is triggered by a commit or pull request on `main` branch.
#### Steps to publish a new release:
1. Check if the version number is correctly set in `setup.py` and `__init__.py`
2. Create a new pull request from `dev` branch to `main` branch. Accept this pull request
3. Wait until the _test_ GH workflow ends and succeeds
4. Create a new *Release* in GitHub. Set the version number as the name
5. Wait until the _publish_ GH workflow ends and succeeds
6. Check if package is available on [PyPI](https://pypi.org/project/crystaldiskmark-parser/)
Raw data
{
"_id": null,
"home_page": "https://github.com/soerenmetje/CrystalDiskMark-Parser",
"name": "crystaldiskmark-parser",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "python, parser, benchmark, crystaldiskmark7, crystaldiskmark8",
"author": "Soeren Metje",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/61/20/ccf461ae84348223dcd98b757e2d07c12540f86a33b5053ee07636ba799d/crystaldiskmark_parser-1.0.4.tar.gz",
"platform": null,
"description": "\n# CrystalDiskMark-Parser\n\n![CI workflow](https://github.com/soerenmetje/CrystalDiskMark-Parser/actions/workflows/main.yml/badge.svg)\n\nRead in the .txt files generated by [CrystalDiskMark](https://en.wikipedia.org/wiki/CrystalDiskMark) in Python. \nThis library was created to enable visualizing the benchmark results of \n[CrystalDiskMark](https://en.wikipedia.org/wiki/CrystalDiskMark) in an automated way. \nThe following plot created with [matplotlib](https://pypi.org/project/matplotlib/) is an example.\n\n![Example Plot Benchmark](examples/plots/example3.png)\n\n\n## Install\n\n```shell\npip install crystaldiskmark-parser\n```\nSee https://pypi.org/project/crystaldiskmark-parser/ for more information.\n\n## Overview\n\nThe library provides two Functions:\n- `parse(filepath)`: Returns parsed data as a `crystaldiskmark_parser.BenchmarkResult`\n- `parse_df(filepath)`: Returns parsed data as a `pandas.DataFrame`\n\nUsing `parse_df(filepath)` is recommended.\n\n\n\n## Example 0: Print DataFrame\n\n```python\nfrom crystaldiskmark_parser.parser import parse_df\n\ndf = parse_df(\"../test/data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt\")\nprint(df)\n```\n### Output\n```\n\n date test \\\n0 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n1 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n2 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n3 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n4 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n5 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n6 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n7 2021/06/22 17:19:21 1 GiB (x5) [E: 96% (894/932GiB)] \n\n time os \\\n0 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n1 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n2 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n3 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n4 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n5 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n6 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n7 Measure 5 sec / Interval 5 sec Windows 10 [10.0 Build 19042] (x64) \n\n mode profile comment read_write type blocksize unit_blocksize \\\n0 [Admin] Default WD Blue 3D 1TB read SEQ 1.0 MiB \n1 [Admin] Default WD Blue 3D 1TB read SEQ 1.0 MiB \n2 [Admin] Default WD Blue 3D 1TB read RND 4.0 KiB \n3 [Admin] Default WD Blue 3D 1TB read RND 4.0 KiB \n4 [Admin] Default WD Blue 3D 1TB write SEQ 1.0 MiB \n5 [Admin] Default WD Blue 3D 1TB write SEQ 1.0 MiB \n6 [Admin] Default WD Blue 3D 1TB write RND 4.0 KiB \n7 [Admin] Default WD Blue 3D 1TB write RND 4.0 KiB \n\n queues threads rate unit_rate iops unit_iops latency unit_latency \n0 8 1 531.458 MB/s 506.8 IOPS 15726.77 us \n1 1 1 489.838 MB/s 467.1 IOPS 2139.41 us \n2 32 1 269.406 MB/s 65772.9 IOPS 470.58 us \n3 1 1 41.375 MB/s 10101.3 IOPS 98.75 us \n4 8 1 498.656 MB/s 475.6 IOPS 16750.30 us \n5 1 1 485.163 MB/s 462.7 IOPS 2159.18 us \n6 32 1 222.691 MB/s 54367.9 IOPS 583.02 us \n7 1 1 99.900 MB/s 24389.6 IOPS 40.73 us \n```\n## Example 1: Visualize benchmark results\n\n```python\nfrom crystaldiskmark_parser.parser import parse_df\nimport matplotlib.pyplot as plt\n\n# Read to one big DataFrame\ndf = parse_df(\"../test/data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt\")\ndf = df.append(parse_df(\"../test/data/CrystalDiskMark_20210622163451 SAMSUNG 840 EVO 120GB.txt\"))\ndf = df.append(parse_df(\"../test/data/CrystalDiskMark_20210626154221 Crucial P2 2TB on H87M.txt\"))\ndf = df.append(parse_df(\"../test/data/CrystalDiskMark_20210627172807 Crucial P2 2TB on X370.txt\"))\nprint(df.info())\n\n# Extract relevant rows\ndata = df.loc[(df['read_write'] == 'read')\n & (df['type'] == \"SEQ\")\n & (df['queues'] == 8)\n & (df['blocksize'] == 1)\n & (df['unit_blocksize'] == \"MiB\")]\n\n# Extract relevant columns\nrate = data[\"rate\"]\nname = data[\"comment\"]\n\n# Plot\nfig, ax = plt.subplots(figsize=(10, 6))\ncon = ax.bar(name, rate)\nax.bar_label(con)\nax.set_title(\"Sequential Read Rate of SSDs\")\nax.set_ylabel(\"Rate [MB/s]\")\nplt.show()\n```\n\n![Example Plot Benchmark](examples/plots/example1.png)\n\n\n## Example 2: Visualize benchmark results (extended)\n\n```python\n\nfrom crystaldiskmark_parser.parser import parse_df\n\nimport matplotlib.pyplot as plt\n\n\n#%%\n# Read to one big DataFrame\ndf = parse_df(\"../test/data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt\")\ndf = df.append(parse_df(\"../test/data/CrystalDiskMark_20210622163451 SAMSUNG 840 EVO 120GB.txt\"))\ndf = df.append(parse_df(\"../test/data/CrystalDiskMark_20210626154221 Crucial P2 2TB on H87M.txt\"))\ndf = df.append(parse_df(\"../test/data/CrystalDiskMark_20210627172807 Crucial P2 2TB on X370.txt\"))\n\n# Extract relevant rows\ndata = df.loc[(df['read_write'] == 'read')\n & (df['type'] == \"SEQ\")\n & (df['queues'] == 8)\n & (df['blocksize'] == 1)\n & (df['unit_blocksize'] == \"MiB\")]\n\n# Extract relevant columns\nread_rate = data[\"rate\"]\nread_rate = [round(x) for x in read_rate]\nname = data[\"comment\"]\n\n# Extract relevant rows\ndata = df.loc[(df['read_write'] == 'write')\n & (df['type'] == \"SEQ\")\n & (df['queues'] == 8)\n & (df['blocksize'] == 1)\n & (df['unit_blocksize'] == \"MiB\")]\n\n# Extract relevant columns\nwrite_rate = data[\"rate\"]\nwrite_rate = [round(x) for x in write_rate]\n\n# Plot\nfig, ax = plt.subplots(figsize=(12, 6))\ncon = ax.bar([float(x) + .25 for x in range(len(read_rate))], read_rate, tick_label=name, width = 0.25)\nax.bar_label(con)\ncon = ax.bar([float(x) + .5 for x in range(len(write_rate))], write_rate, width = 0.25)\nax.bar_label(con)\nax.set_title(\"Sequential Read & Write Rate of SSDs\")\nax.set_ylabel(\"Rate [MB/s]\")\nplt.legend([\"read\", \"write\"])\nplt.show()\n```\n\n![Example Plot Benchmark](examples/plots/example3.png)\n\n## Example 3: Visualize benchmark results (without DataFrame)\n\n```python\n\nfrom crystaldiskmark_parser.parser import parse\nimport matplotlib.pyplot as plt\n\nresult_wd = parse(\"data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt\")\nresult_samsung = parse(\"data/CrystalDiskMark_20210622163451 SAMSUNG 840 EVO 120GB.txt\")\n\ndata = [result_wd.read_results[0].rate, result_samsung.read_results[0].rate]\n\nfig, ax = plt.subplots(figsize=(10,6))\ncon = ax.bar([\"WD Blue 3D 1TB\", \"Samsung 840 EVO 120GB\"], data)\nax.bar_label(con)\nax.set_title(\"Read Rate of SSDs\")\nax.set_ylabel(f\"Rate [{result_wd.read_results[0].unit_rate}]\")\nplt.show()\n```\n\n![Example Plot Benchmark](examples/plots/example0.png)\n\n## Example 4: Print BenchmarkResult\n\n```python\nfrom crystaldiskmark_parser.parser import parse\n\nbenchmark_result = parse(\"data/CrystalDiskMark_20210622162528 WD Blue 3D 1TB WDS100T2B0A.txt\")\nprint(benchmark_result)\n```\n\n### Output\n\n```\nBenchmarkResult({'test': '1 GiB (x5) [E: 96% (894/932GiB)]', 'date': '2021/06/22 17:19:21', 'os': 'Windows 10 [10.0 Build 19042] (x64)', 'profile': 'Default', 'time': 'Measure 5 sec / Interval 5 sec', 'mode': '[Admin]', 'comment': 'WD Blue 3D 1TB WDS100T2B0A', 'write_results': [TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 8, 'threads': 1, 'rate': 498.656, 'unit_rate': 'MB/s', 'iops': 475.6, 'unit_iops': 'IOPS', 'latency': 16750.3, 'unit_latency': 'us'}), TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 1, 'threads': 1, 'rate': 485.163, 'unit_rate': 'MB/s', 'iops': 462.7, 'unit_iops': 'IOPS', 'latency': 2159.18, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 32, 'threads': 1, 'rate': 222.691, 'unit_rate': 'MB/s', 'iops': 54367.9, 'unit_iops': 'IOPS', 'latency': 583.02, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 1, 'threads': 1, 'rate': 99.9, 'unit_rate': 'MB/s', 'iops': 24389.6, 'unit_iops': 'IOPS', 'latency': 40.73, 'unit_latency': 'us'})], 'read_results': [TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 8, 'threads': 1, 'rate': 531.458, 'unit_rate': 'MB/s', 'iops': 506.8, 'unit_iops': 'IOPS', 'latency': 15726.77, 'unit_latency': 'us'}), TestResult({'test_type': 'SEQ', 'block_size': 1.0, 'unit_block_size': 'MiB', 'queues': 1, 'threads': 1, 'rate': 489.838, 'unit_rate': 'MB/s', 'iops': 467.1, 'unit_iops': 'IOPS', 'latency': 2139.41, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 32, 'threads': 1, 'rate': 269.406, 'unit_rate': 'MB/s', 'iops': 65772.9, 'unit_iops': 'IOPS', 'latency': 470.58, 'unit_latency': 'us'}), TestResult({'test_type': 'RND', 'block_size': 4.0, 'unit_block_size': 'KiB', 'queues': 1, 'threads': 1, 'rate': 41.375, 'unit_rate': 'MB/s', 'iops': 10101.3, 'unit_iops': 'IOPS', 'latency': 98.75, 'unit_latency': 'us'})]})\n```\n\n\n## Development\n\n### Build and Publish a New Release\n\nThis repository has a GH Actions CI/CD pipeline that handle building and publishing the package to PyPI.\nIt is triggered by a commit or pull request on `main` branch. \n\n#### Steps to publish a new release:\n\n1. Check if the version number is correctly set in `setup.py` and `__init__.py`\n2. Create a new pull request from `dev` branch to `main` branch. Accept this pull request\n3. Wait until the _test_ GH workflow ends and succeeds\n4. Create a new *Release* in GitHub. Set the version number as the name\n5. Wait until the _publish_ GH workflow ends and succeeds\n6. Check if package is available on [PyPI](https://pypi.org/project/crystaldiskmark-parser/)\n",
"bugtrack_url": null,
"license": null,
"summary": "Read in the .txt files generated by CrystalDiskMark in Python",
"version": "1.0.4",
"project_urls": {
"Homepage": "https://github.com/soerenmetje/CrystalDiskMark-Parser"
},
"split_keywords": [
"python",
" parser",
" benchmark",
" crystaldiskmark7",
" crystaldiskmark8"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0a640628b8e37164cd73e61bdb4265d9369fc2b03ef33fda10d8e86f9d18e468",
"md5": "17420737103ed45c0545cce4581e4c0c",
"sha256": "32c6164ea5d21cb7dd62f09793e4626bc80984de2fac78b43ecbae5ce63081a4"
},
"downloads": -1,
"filename": "crystaldiskmark_parser-1.0.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "17420737103ed45c0545cce4581e4c0c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 18915,
"upload_time": "2024-03-28T21:39:58",
"upload_time_iso_8601": "2024-03-28T21:39:58.373895Z",
"url": "https://files.pythonhosted.org/packages/0a/64/0628b8e37164cd73e61bdb4265d9369fc2b03ef33fda10d8e86f9d18e468/crystaldiskmark_parser-1.0.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6120ccf461ae84348223dcd98b757e2d07c12540f86a33b5053ee07636ba799d",
"md5": "6176cee12b80420822eda0c273d991a9",
"sha256": "9255cba7aada70cc579732174c710f5b3fcd5896d8fd0fe8ab9495ee0597e2be"
},
"downloads": -1,
"filename": "crystaldiskmark_parser-1.0.4.tar.gz",
"has_sig": false,
"md5_digest": "6176cee12b80420822eda0c273d991a9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 19471,
"upload_time": "2024-03-28T21:39:59",
"upload_time_iso_8601": "2024-03-28T21:39:59.946059Z",
"url": "https://files.pythonhosted.org/packages/61/20/ccf461ae84348223dcd98b757e2d07c12540f86a33b5053ee07636ba799d/crystaldiskmark_parser-1.0.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-28 21:39:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "soerenmetje",
"github_project": "CrystalDiskMark-Parser",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "crystaldiskmark-parser"
}