14#include "arcane/utils/IOException.h"
15#include "arcane/utils/Array.h"
16#include "arcane/utils/TraceInfo.h"
17#include "arcane/utils/IDataCompressor.h"
19#include "arcane/FactoryService.h"
20#include "arcane/AbstractService.h"
21#include "arcane/IDeflateService.h"
36class LZ4DeflateService
54 int dest_capacity = LZ4_compressBound(input_size);
58 compressed_values.
resize(dest_capacity);
61 char* dest =
reinterpret_cast<char*
>(compressed_values.
data());
63 const char* source =
reinterpret_cast<const char*
>(values.
data());
64 unsigned int source_len = (
unsigned int)input_size;
67 info() <<
"CHECK COMPRESS dest=" << (
void*)dest
68 <<
" dest_len=" << dest_len
69 <<
" source=" << (
void*)source
70 <<
" source_len=" << source_len;
73 int r = LZ4_compress_default(source,dest,source_len,dest_capacity);
76 throw IOException(A_FUNCINFO,String::format(
"io error during compression r={0}",r));
78 Real ratio = (dest_len * 100.0 ) / source_len;
79 info() <<
"LZ4 compress r=" << r <<
" source_len=" << source_len
80 <<
" dest_len=" << dest_len <<
" ratio=" << ratio;
81 compressed_values.
resize(dest_len);
86 char* dest =
reinterpret_cast<char*
>(values.
data());
87 int dest_len = values.
size();
89 const char* source =
reinterpret_cast<const char*
>(compressed_values.
data());
90 int source_len = compressed_values.
size();
92 int r = LZ4_decompress_safe(source,dest,source_len,dest_len);
93 info() <<
"LZ4 decompress r=" << r <<
" source_len=" << source_len <<
" dest_len=" << dest_len;
95 throw IOException(A_FUNCINFO,String::format(
"io error during decompression r={0}",r));
104class LZ4DataCompressor
125 int input_size = _toInt(values.
size());
127 if (input_size>LZ4_MAX_INPUT_SIZE)
130 int dest_capacity = LZ4_compressBound(input_size);
131 compressed_values.
resize(dest_capacity);
133 char* dest =
reinterpret_cast<char*
>(compressed_values.
data());
134 const char* source =
reinterpret_cast<const char*
>(values.
data());
136 int r = LZ4_compress_default(source,dest,input_size,dest_capacity);
141 Real ratio = (dest_len * 100.0 ) / input_size;
142 info(5) <<
"LZ4 compress r=" << r <<
" source_len=" << input_size
143 <<
" dest_len=" << dest_len <<
" ratio=" << ratio;
145 compressed_values.
resize(dest_len);
150 char* dest =
reinterpret_cast<char*
>(values.
data());
151 int dest_len = _toInt(values.
size());
153 const char* source =
reinterpret_cast<const char*
>(compressed_values.
data());
154 int source_len = _toInt(compressed_values.
size());
156 int r = LZ4_decompress_safe(source,dest,source_len,dest_len);
157 info(5) <<
"LZ4 decompress r=" << r <<
" source_len=" << source_len <<
" dest_len=" << dest_len;
164 int _toInt(
Int64 vsize)
167 Int64 max_int_size = std::numeric_limits<int>::max();
168 if (vsize>max_int_size)
170 return static_cast<int>(vsize);
#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.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
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.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'un service permettant de compresser/décompresser des données.
Interface d'un service permettant de compresser/décompresser des données.
Exception lorsqu'une erreur d'entrée/sortie est détectée.
virtual String localName() const =0
Partie locale du nom du service.
Service de compression utilisant la bibliothèque 'LZ4'.
void compress(Span< const std::byte > values, Array< std::byte > &compressed_values) override
Compresse les données values et les stocke dans compressed_values.
void build() override
Construction de niveau build du service.
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.
Int64 minCompressSize() const override
Taille minimale du tableau en dessous de laquelle il n'est pas utile de compresser.
String name() const override
Nom de l'algorithme.
Service de compression utilisant la bibliothèque 'LZ4'.
void decompress(ByteConstArrayView compressed_values, ByteArrayView values) override
Décompresse les données compressed_values et les stocke dans values.
void build() override
Construction de niveau build du service.
void compress(ByteConstArrayView values, ByteArray &compressed_values) override
Compresse les données values et les stocke dans compressed_values.
Structure contenant les informations pour créer un service.
IServiceInfo * serviceInfo() const
Accès au IServiceInfo associé
Propriétés de création d'un service.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
#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 -*-
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
@ 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.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.