54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
import h5py
|
|
import numpy as np
|
|
import psycopg2
|
|
from psycopg2.extras import execute_values
|
|
from datetime import datetime, timezone, timedelta
|
|
import os
|
|
from tqdm import tqdm
|
|
|
|
DB_URL = "postgresql://postgres:seismic_pass@db:5432/seismic_data"
|
|
|
|
def fix_path(p):
|
|
p = p.replace('\\', '/')
|
|
if p.startswith('F:/'): return '/mnt/kingston/' + p[3:]
|
|
if p.startswith('E:/'): return '/mnt/data_sdb1/' + p[3:]
|
|
return p
|
|
|
|
def migrate_file(h5_path, node_id, channel, start_offset_sec=0, duration_sec=3600):
|
|
h5_path = fix_path(h5_path)
|
|
conn = psycopg2.connect(DB_URL)
|
|
cur = conn.cursor()
|
|
|
|
with h5py.File(h5_path, 'r') as f:
|
|
ds = f['adc_values']
|
|
start_ts = int(ds.attrs['timestamp'])
|
|
# On calcule le début réel
|
|
actual_start = start_ts + start_offset_sec
|
|
start_idx = start_offset_sec * 200
|
|
end_idx = start_idx + (duration_sec * 200)
|
|
|
|
data = ds[start_idx:end_idx]
|
|
print(f"Migrating {len(data)} samples...")
|
|
|
|
# Préparation des tuples pour insertion par lots
|
|
batch_size = 10000
|
|
for i in range(0, len(data), batch_size):
|
|
batch = data[i:i+batch_size]
|
|
values = []
|
|
for j, val in enumerate(batch):
|
|
ts = datetime.fromtimestamp(actual_start + (i + j) / 200, tz=timezone.utc)
|
|
values.append((ts, node_id, channel, float(val)))
|
|
|
|
execute_values(cur, "INSERT INTO adc_samples (time, node_id, channel, value) VALUES %s", values)
|
|
conn.commit()
|
|
|
|
cur.close()
|
|
conn.close()
|
|
print("Done.")
|
|
|
|
if __name__ == "__main__":
|
|
# Test sur Node 193, 1er septembre (Julian 245), 10 minutes
|
|
# On cherche un fichier du node 193
|
|
import sys
|
|
migrate_file(sys.argv[1], sys.argv[2], sys.argv[3], duration_sec=600)
|