Arcane  v3.16.6.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ZstdDataCompressor.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ZstdDataCompressor.cc (C) 2000-2025 */
9/* */
10/* Service de compression utilisant la bibliothèque 'zstd'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/IOException.h"
15#include "arcane/utils/Array.h"
16#include "arcane/utils/TraceInfo.h"
17#include "arcane/utils/IDataCompressor.h"
18
19#include "arcane/FactoryService.h"
20#include "arcane/AbstractService.h"
21#include "arcane/IDeflateService.h"
22
23#include <zstd.h>
24// Nécessaire pour les versions de zstd antérieures à 1.5.6.
25#include <zstd_errors.h>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
38class ZstdDataCompressor
39: public AbstractService
40, public IDataCompressor
41{
42 public:
43
44 explicit ZstdDataCompressor(const ServiceBuildInfo& sbi)
45 : AbstractService(sbi)
46 , m_name(sbi.serviceInfo()->localName())
47 {
48 }
49
50 public:
51
52 void build() override {}
53 String name() const override { return m_name; }
54 Int64 minCompressSize() const override { return 512; }
55 void compress(Span<const std::byte> values, Array<std::byte>& compressed_values) override
56 {
57 size_t input_size = values.size();
58 size_t dest_capacity = ZSTD_compressBound(input_size);
59 compressed_values.resize(dest_capacity);
60
61 void* dest = compressed_values.data();
62 const void* source = values.data();
63 int compression_level = 1;
64 size_t r = ZSTD_compress(dest, dest_capacity, source, input_size, compression_level);
65 if (ZSTD_isError(r)) {
66 ZSTD_ErrorCode err_code = ZSTD_getErrorCode(r);
67 ARCANE_THROW(IOException, "IO error during compression r={0} msg={1}", err_code, ZSTD_getErrorString(err_code));
68 }
69 size_t dest_len = r;
70 if (input_size > 0) {
71 Real ratio = (static_cast<double>(dest_len) * 100.0) / static_cast<double>(input_size);
72 info(5) << "ZSTD compress r=" << r << " source_len=" << input_size
73 << " dest_len=" << dest_len << " ratio=" << ratio;
74 }
75 compressed_values.resize(dest_len);
76 }
77
78 void decompress(Span<const std::byte> compressed_values, Span<std::byte> values) override
79 {
80 void* dest = values.data();
81 size_t dest_len = values.size();
82
83 const void* source = compressed_values.data();
84 size_t source_len = compressed_values.size();
85
86 size_t r = ZSTD_decompress(dest, dest_len, source, source_len);
87 info(5) << "ZSTD decompress r=" << r << " source_len=" << source_len << " dest_len=" << dest_len;
88 if (ZSTD_isError(r)) {
89 ZSTD_ErrorCode err_code = ZSTD_getErrorCode(r);
90 ARCANE_THROW(IOException, "IO error during decompression r={0} msg={1}", err_code, ZSTD_getErrorString(err_code));
91 }
92 }
93
94 private:
95
96 String m_name;
97};
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102ARCANE_REGISTER_SERVICE(ZstdDataCompressor,
103 ServiceProperty("zstdDataCompressor", ST_Application | ST_CaseOption),
104 ARCANE_SERVICE_INTERFACE(IDataCompressor));
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108
109} // End namespace Arcane
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
Tableau d'items de types quelconques.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
const T * data() const
Accès à la racine du tableau hors toute protection.
Interface d'un service permettant de compresser/décompresser des données.
Exception lorsqu'une erreur d'entrée/sortie est détectée.
Definition IOException.h:32
virtual String localName() const =0
Partie locale du nom du service.
Structure contenant les informations pour créer un service.
IServiceInfo * serviceInfo() const
Accès au IServiceInfo associé
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:212
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:422
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Int64 minCompressSize() const override
Taille minimale du tableau en dessous de laquelle il n'est pas utile de compresser.
void build() override
Construction de niveau build du service.
String name() const override
Nom de l'algorithme.
void decompress(Span< const std::byte > compressed_values, Span< std::byte > values) override
Décompresse les données compressed_values et les stocke dans values.
void compress(Span< const std::byte > values, Array< std::byte > &compressed_values) override
Compresse les données values et les stocke dans compressed_values.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
@ ST_Application
Le service s'utilise au niveau de l'application.
@ ST_CaseOption
Le service s'utilise au niveau du jeu de données.
double Real
Type représentant un réel.