crystaldiskmark-parser


Namecrystaldiskmark-parser JSON
Version 1.0.4 PyPI version JSON
download
home_pagehttps://github.com/soerenmetje/CrystalDiskMark-Parser
SummaryRead in the .txt files generated by CrystalDiskMark in Python
upload_time2024-03-28 21:39:59
maintainerNone
docs_urlNone
authorSoeren Metje
requires_pythonNone
licenseNone
keywords python parser benchmark crystaldiskmark7 crystaldiskmark8
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
# 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"
}
        
Elapsed time: 0.26246s