File: mem_usage.ml

package info (click to toggle)
ocaml-mem-usage 0.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 168 kB
  • sloc: ansic: 253; ml: 96; makefile: 3
file content (59 lines) | stat: -rw-r--r-- 1,745 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(*
 * SPDX-FileCopyrightText: 2022 - 2024 Savonet team
 *
 * SPDX-License-Identifier: MIT
 *)

type t = {
  total_virtual_memory : int;
  total_physical_memory : int;
  total_used_virtual_memory : int;
  total_used_physical_memory : int;
  process_virtual_memory : int;
  process_physical_memory : int;
  process_private_memory : int;
  process_swapped_memory : int;
}

external info : unit -> t = "ocaml_mem_usage_mem_usage"

let byte_units = ["B"; "kB"; "MB"; "GB"; "TB"; "PB"; "EB"; "ZB"; "YB"]
let bibyte_units = ["B"; "kiB"; "MiB"; "GiB"; "TiB"; "PiB"; "EiB"; "ZiB"; "YiB"]

let bit_units =
  ["b"; "kbit"; "Mbit"; "Gbit"; "Tbit"; "Pbit"; "Ebit"; "Zbit"; "Ybit"]

let bibit_units =
  ["b"; "kibit"; "Mibit"; "Gibit"; "Tibit"; "Pibit"; "Eibit"; "Zibit"; "Yibit"]

let prettify_bytes ?(float_printer = Printf.sprintf "%.02f") ?(signed = false)
    ?(bits = false) ?(binary = false) bytes =
  let units =
    match (bits, binary) with
      | true, true -> bibit_units
      | true, false -> bit_units
      | false, true -> bibyte_units
      | false, false -> byte_units
  in

  let prefix, bytes =
    if bytes < 0 then ("-", -bytes) else ((if signed then "+" else ""), bytes)
  in

  if bytes = 0 then Printf.sprintf "%s0 %s" prefix (List.hd units)
  else (
    let exponent =
      Float.floor
        (if binary then log (float bytes) /. log 1024.
         else log10 (float bytes) /. 3.)
    in
    let unit_index =
      if List.length units - 1 < int_of_float exponent then
        List.length units - 1
      else int_of_float exponent
    in
    let bytes =
      float bytes /. Float.pow (if binary then 1024. else 1000.) exponent
    in
    Printf.sprintf "%s%s %s" prefix (float_printer bytes)
      (List.nth units unit_index))