casacore
Loading...
Searching...
No Matches
SiscoWriter.h
Go to the documentation of this file.
1#ifndef SISCO_SISCO_WRITER_H_
2#define SISCO_SISCO_WRITER_H_
3
4#include <complex>
5#include <fstream>
6#include <list>
7#include <map>
8#include <set>
9#include <span>
10#include <string>
11#include <thread>
12#include <vector>
13
14#include "ConditionalQueue.h"
15#include "Deflate.h"
16#include "Lane.h"
17#include "Sisco.h"
18
19namespace casacore::sisco {
20
26 public:
27 SiscoWriter(const std::string& filename, int predict_level,
28 int deflate_level);
31 if (file_.is_open()) Close();
32 }
34
35 void Open(std::span<const std::byte> header_data);
36 void Write(size_t baseline_index, std::span<const std::complex<float>> data);
37 void Close();
38
39 private:
40 struct Chunk {
41 size_t index;
42 std::vector<std::byte> mantisas_data;
43 std::vector<std::byte> exponent_data;
45 // Whenever a thread finishes preprocessing, it will update this value. If
46 // the value is high enough, the thread knows the chunk is ready for
47 // deflate.
49 size_t n_finished_items = 0;
50 size_t item_counter = 0;
51 size_t chunk_size = 0;
52 };
54 std::vector<float> real_data;
55 std::vector<float> imaginary_data;
57 std::byte* mantisa_position;
60 };
61 struct WriteTask {
62 size_t index;
64 std::vector<std::byte> data;
65 };
71 struct ThreadData {};
72
73 void NewChunk(std::unique_lock<std::mutex>& lock);
74 void RemoveChunk(const Chunk* chunk);
76 void WriteLoop();
78 std::unique_lock<std::mutex>& lock);
79 void WriteChunk(size_t uncompressed_size, std::span<const std::byte> data);
80 void DeflateChunk(Chunk& chunk);
81
82 // Chunk data
83 constexpr static size_t kDefaultChunkSize = 1024 * 1024;
87 size_t n_chunks_ = 0;
88 // A list is used because we do not want to invalidate pointers when
89 // adding/removing members. Access requires holding the mutex.
90 std::list<Chunk> chunks_;
92
93 // Indexed by baseline_index.
94 std::map<size_t, BaselineData> baseline_data_;
95 std::ofstream file_;
96 std::string filename_;
101
102 std::mutex mutex_;
103 std::condition_variable chunk_finished_condition_;
106 std::set<size_t> busy_baselines_;
107 std::vector<std::thread> compression_threads_;
108 std::thread write_thread_;
109};
110
111} // namespace casacore::sisco
112
113#endif
Internal header file for the Lane.
The Lane is an efficient cyclic buffer that is synchronized.
Definition Lane.h:100
A queue with a limited size and the ability to query only specific values.
void RemoveChunk(const Chunk *chunk)
aocommon::Lane< WriteTask > write_tasks_
std::set< size_t > busy_baselines_
Holds a list of baseline ids currently being preprocessed.
static constexpr size_t kDefaultChunkSize
Chunk data.
Definition SiscoWriter.h:83
void Preprocess(SiscoWriter::PreprocessingTask &task, std::unique_lock< std::mutex > &lock)
std::condition_variable chunk_finished_condition_
SiscoWriter(SiscoWriter &&)=delete
ConditionalQueue< PreprocessingTask > preprocessing_tasks_
Definition SiscoWriter.h:99
std::list< Chunk > chunks_
A list is used because we do not want to invalidate pointers when adding/removing members.
Definition SiscoWriter.h:90
std::vector< std::thread > compression_threads_
void Write(size_t baseline_index, std::span< const std::complex< float > > data)
SiscoWriter & operator=(SiscoWriter &&)=delete
SiscoWriter(const std::string &filename, int predict_level, int deflate_level)
std::map< size_t, BaselineData > baseline_data_
Indexed by baseline_index.
Definition SiscoWriter.h:94
void NewChunk(std::unique_lock< std::mutex > &lock)
void DeflateChunk(Chunk &chunk)
void WriteChunk(size_t uncompressed_size, std::span< const std::byte > data)
void Open(std::span< const std::byte > header_data)
std::vector< std::byte > mantisas_data
Definition SiscoWriter.h:42
size_t n_allocated_items
Whenever a thread finishes preprocessing, it will update this value.
Definition SiscoWriter.h:48
std::vector< std::byte > exponent_data
Definition SiscoWriter.h:43