• 締切済み

大量のバイナリーデータ(約50GB)をRDB:OracleまたはDB2で扱うには?

スキャナーで取込んだ大量のバイナリーデータ(約50GB)をRDB:Oracleまたは、DB2で1個のテーブルとして扱いたいのですが、普通のテキスト文字、数字とは異なり、LOB(Large Object)と呼ばれるデータ構造ですので、列を分けて専用のtable spaceに置く?予定ですが、過去にこういった膨大なバイナリデータを扱った事例は、存在するのでしょうか? その際の容量制限や、パフォーマンスは? どうなんでしょうか? 今後、ますます増える傾向にあると思いますが、いかがでしょうか?

  • iwasa
  • お礼率68% (20/29)

みんなの回答

  • pancho
  • ベストアンサー率35% (302/848)
回答No.1

Oracleを用いたシステムを開発しており、大量のバイナリデータもありますが、実際上は画像が保存されているパス名(ディレクトリ名とファイル名9をOracle上に置いているだけで、データとしては取り込んでいません。 最終的にバイナリデータを画像として利用する場合は、HTMLファイルを作成し、ブラウザ上で確認しています。 このようなデータをデータベースに直接扱わせると、メリットよりデメリットの方が多いため、こんな方法を用いていますが、目的にあっていますでしょうか? 以上。

iwasa
質問者

お礼

ご回答、ありがとうございました。 大いに参考となりました。 50GBの画像データは、全国各地、多数のユーザーからアクセスされて、毎日、頻繁に更新されますので、 HTML上やブラウザ上でなく、できれば、RDB上で更新可能にしたいのです。(ほとんどは、"insert"処理 ) どうもありがとう、ございました。

関連するQ&A

  • バイナリデータ格納について

    はじめまして。 現在、以下のシステム構成でWEBシステムを作成しています。 ▼システム構成 ----------------------  CentOS 5.97  PHP 5.1.6  POSTGRESQL 8.1.9  Apache 2.2.3 ---------------------- PHPを使用して、画像ファイルをバイナリデータに変換し DBに格納しようとしていますが、うまく動作しません。 ▼ソース ---------------------- //画像をバイナリ型に変換します。 $fn = "../../images/uploaded/$image_name"; $cn = @file_get_contents("$fn"); $esc_image = pg_escape_bytea($cn); //DB登録に写真を登録します。 $s=""; $s.="insert into cbphoto("; $s.=" photoid,"; $s.=" photo"; $s.=") values ("; $s.=" $photoid,"; $s.=" '{$esc_image}'"; $s.=")"; $r=pg_exec($db,$s); ---------------------- 小さいファイル(20kb以下前後)は問題なく格納できるのですが、 大きいファイルの場合は、格納されません。 ※ただし、上記のphotoidは格納されます。  また、エラーメッセージも出力されていない様です。 マニュアルを確認するとバイナリ列は1GBまで格納できると 記載されていましたが、ファイルサイズが原因で格納できないのでしょうか? また、他に原因があるのでしょうか? (ラージオブジェクトじゃないとダメ等) 以上、お手数ですがよろしくお願いいたします。

  • 膨大なデータの有効な移行方法は?(Oracle10g)

    現在1000万件近くデータがあるテーブルをパフォーマンス向上のため、パーティション化することを考えています。 環境は、Oracle10gです。 一旦、パーティション・テーブルを作成した後、データを移行する必要がありますが、 その方法に以下を考えました。  ・Accessのクエリを使って「追加」  ・ObjectBrowserでInsert文を出力し、それでInsert 膨大な件数ですので、どちらにしろ時間がかかります。 どちらかというと、後者のほうがいいのかなぁと思いましたが…。 もしこれ以外に有効な方法(10gに用意されているツール等)がありましたら、ご教授願えませんでしょうか?

  • 繰り返し項目のデメリット(第1正規化)

    こんにちは。1つ質問があります。 現在、繰り返し項目をもつDBより、繰り返し項目を持たないDB=RDBの方が主流になっていますが、それはなぜでしょうか?(近年、RDBも繰り返し項目をサポートしつつあるのは無視してください) つまり、恐らく歴史的に、「繰り返し項目を持つメリット」より「繰り返し項目を持たない(第1正規化)メリット」の方が大きいと考えられたので、「繰り返し項目を持たないDB=RDB」が主流になったと思うのですが、なぜでしょうか? ■繰り返し項目を持たないデータ構造(RDB) 山田 趣味1 山田 趣味2 山田 趣味4 井上 趣味2 井上 趣味3 ■繰り返し項目を持つデータ構造 山田 趣味1 趣味2 趣味4 井上 趣味2 趣味3 よろしくお願いします。

  • DBからSelectしたレコードのデータをブラウザに一覧表示したい

    PHPでDB(ORACLE)に接続し、SQLを発行しSelectした複数行のレコードのデータをブラウザに返して一覧表示したいです。 PHPで、DB(ORACLE)に接続し、SQLを発行させるのはわかります。 知りたいと思っている部分は、ブラウザ上に複数行のレコードのデータを上手く反映させるところです。 LOOPとかでHTMLを書き出すのだと思うのですが、もっとスマートに行えるような手法をご存知の方がいましたら、ご教授下さいませ。 今まで、VBAで同様なことを行っていたのですが、EXCELにはあらかじめセルが用意されていることもあってセルに返せば済んでいたので表示部分はほとんど考えなくて、ある意味簡単でした。 しかし、PHPでブラウザに表示させる際には、セルのようなものはないので、tableタグなど駆使してHTMLを吐き出すしかないのかなぁと思っていますが、もっとスマートにブラウザ表示させられる方法があればと思っている次第です。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • MySQLにバイナリデータを正常に保存できない

    ローカルに保存してあるファイルをMySQLにバイナリデータとして格納して保存したいと思ってます。 データは格納できるのですが、文字エンコード?の問題でファイルが壊れてしまっているみたいです。 格納後、出力した際にjpgなどの画像は問題なく表示されるのですが、xlsやpdfなどのファイルが開けなくなります。MySQLの文字コードはUTF8です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect('DBI:mysql:database:localhost:3306', 'user', 'password'); # ファイルパス my $file = '/tmp/test.xls'; # ファイルサイズ my $size = -s $file; # バイナリデータ読み込み my $line; open(IN, $file); binmode(IN); sysread(IN, $line, $size); close(IN); # DBに格納 my $sth = $dbh->prepare(qq|INSERT INTO file_table ( `file_name`, `file_data` ) VALUES (?, ?)|); $sth->execute('test.xls', $line); $dbh->disconnect; 上記のようなコードなのですが、おかしな点があれば教えてください。 よろしくおねがいします。

    • ベストアンサー
    • Perl
  • BLOBやCLOBのパフォーマンスを改善したい

    Oracle 10g R2 を使用し、開発を行っていますが、 パフォーマンス改善という壁にぶつかっており、 お助けいただきたいと思いました。 要求定義の段階で、可変長のバイナリデータを扱う必要があり、 テーブル内には BLOB フィールドを用意しております。 レコード件数にすると、全体でおおよそ 500,000 ~ 1,000,000 件に なります。(導入先によって上記範囲内で変動する) データはさらに区分によって判別されるようになっております。 プログラムから投入する SQL 文については、 最適化を行っておりまして、最高のパフォーマンスが得られる であろう構文になっておりますし、テーブルの設計についても、 検索条件となる項目へのインデックス設定を行っています。 現状としてプログラムの中でボトルネックとなっているのは、 BLOB データを Fetch するタイミングなんです。 開発環境は、C#.NET+ODP.NET なんですけど、ミドルウェアは、 oo4o を使った場合でも、Microsoft の Oracle のドライバを 使用したときでも同じ部分でボトルネックになっていました。 ちなみに、BLOB をやめて、CLOB にした場合も、 CLOB データを Fetch する部分がボトルネックになっていました。 テスト段階なのでバイナリデータが 4 KB 未満ですが、 これを VARCHAR2(4000) のフィールドに Base64文字列などで 格納した場合は、LOB データの Fetch はありませんので、 かなり高速な処理が実現できるのですが、実際の運用では、 4 KB を超えるようなバイナリデータが普通に現れてきます。 なので、VARCHAR2 でのデータベース設計ができない状態です。 そもそも、この BLOB フィールドや CLOB フィールドのデータを Fetch する速度を向上させること、というのは可能なのでしょうか? ちなみに、Oracle サーバ側の設定は一切行っておりません。

  • PHPからMySQL・異なるDBにコピー

    PHPからMySQL・異なるDBに接続し同じ構造のテーブルのデータをコピーすることは可能ですか? 以下を実行するとクエリが実行されず「コピーできません」が表示されてしまいます。 どのようにすればコピーできるか教えてください。 $connect1 = mysql_connect("localhost", "user1", "pass1") ; mysql_select_db("db1", $connect1); //db1内にtable1 $connect2 = mysql_connect("localhost", "user2", "pass2") ; mysql_select_db("db2", $connect2); //db2.内にtable2 $sql = "INSERT INTO `db1` . `table1` SELECT * FROM `db2` .`table2`;"; $result = mysql_query($sql, $connect1)or die("コピーできません"); //$result内「$connect1」でも「$connect2」結果は同じです。 //table1とtable2の構造は同じです。

    • ベストアンサー
    • PHP
  • 「Oracle 9i」について

    「Oracle 1.7.3.4」でエクスポートしたデータを、 「Oracle 9i」にインポートした後、 参照すると最後のデータの値がおかしくなってしまいます。 (今のところわかっているのは、8と9が2に変わることです。) レコードの最後がCOMP-3で終わっているのがいけないのでしょうか? よくわからないので、どなたか教えて頂けないでしょうか? (例) *テーブルのレイアウト* CREATE TABLE DB (DB_REC VARCHAR2(21), DB_KEY1 VARCHAR2(9), DB_KEY2 VARCHAR2(1)) TABLESPACE DB_TSPACE STORE (INITIAL 300K NEXT 100K MINEXTENTS 1 MAXEXTENTS 10 PCTINCREASE 0 ); *コピー句* 01 DB-REC. 03 DB-KEY. 05 DB-KEY1 PIC 9(09). 05 DB-KEY2 PIC 9(01). 03 DB-KBN PIC X(01). 03 DB-INYMD PIC 9(08) COMP-3. 03 DB-OUTYMD PIC 9(08) COMP-3. です。よろしくお願いします。

  • PostgreSQLでoidを節約する

    質問があります。 ・PostgreSQLで、oidを節約する方法はあるでしょうか(create tableでWithout OIDSを指定する以外に) ・oidはPostgreSQLが管理上使うらしいのですが、具体的にはどのぐらい消費するか、計算方法はありますでしょうか。 以下、経緯です。 PostgreSQLに大量のバイナリデータを含むデータを登録するようなシステムを作ろうとしています。現在Oracleで動作しているのですが、DBを置き換える計画です。 調べたところ、バイナリデータを入れられる型としてoidとbyteaがありました。 このうちoidは、データを直接レコードに入れるのではなく、データベース全体で一意の番号を使用してバイナリデータを管理するもののようでした。この「一意の番号」というのが4バイト(32bitOSなので)しかなく、さらにこの番号はPostgreSQLも管理上使用するようです。仮に半分がバイナリデータの識別に使えるとして、21億個までデータを入れられる計算です。 充分な数のようにも思いますが、昨今のHDD事情や(1個1KBとして21億個は約2TBです)、OracleのLOBロケーターはバイナリデータの識別だけで20バイト確保されていることと比べると、「4バイト-PostgreSQLの管理使用分」というサイズはどうも不安です。 この制約を回避するためbyteaを使うことにしました。 しかしPostgreSQLにはTOASTという仕組みがあり、データが大きいときは分割して別の仮想的なテーブルに入れられ、その管理には結局oidが使われるというではありませんか。しかもデータは2000バイトづつに分割されてそれぞれにoidが付くという「浪費」っぷりです。 有償DBと比較するのもいかがなものかとは思いますし、何事にも「無限」ということはないのですが、結局バイナリデータがどれだけ入れられるのかが知りたいです。 PostgreSQLは何にどのぐらいoidを消費するか、計算方法を教えてください。 あるいは、何か勘違いをしていましたらご指摘いただけますと助かります。

  • Linuxシェルでの大量データ投入スクリプト

    Linuxシェルでの大量データ投入スクリプト パフォーマンステスト用の大量(数千万件単位)のデータを DBに投入したいと思っています。 これをLinuxシェルで作成しようと思っています。 今まではsqlplus(あ、DBはoracleです)でログインしてから 複数のSQL文をベタベタ列挙したテキストファイルを読み込んで実行したり シェルの中で1回ずつコネクションを作成して処理を行なう というどちらかの方法しか行なったことがありませんでした。 あと、PLSQLで行なう方法もやったことはありますが、今回は 勉強の意味で、Linuxシェルのみを使用して行ないたいと思っています。 今回は、以下の条件・方針で行ないたいと思っています。とりあえず。 ・すべてのSQL文を記述するのではなく、レコードごとに変化する  IDの部分だけをシェルで埋め込む方法にしたい ・コネクションは何度も接続しなおすのではなく、まとめて1回で行ないたい ・ある程度の件数ごと(実質的には500件くらい)にコミットを行ないたい ・とりあえずLinuxシェルでやってみたい ・とりあえずストアドなしでやりたい 途中まで以下のソースを作成しました。 あとはechoの部分を書き換える感じなのですが、 コネクション管理の方法がわからずつまづいています。 まずは、Linuxシェル内でのコネクション管理をすることが出来るのかどうかを 教えてください。もしできるのであればその方法等を教えてください。 出来れば具体的な記述を下記シェルに埋め込む形での解説をお願いしたいです。 よろしくお願いします。 #!/bin/sh declare -i I=10 echo 【DBコネクション取得】 until [ ${I} -eq 0 ] do echo 【ID部分を埋め込んでINSERT文作成】 echo 【INSERT文実行】 if [ `expr ${I} % 3` -eq 0 ]; then echo 【commit文】 fi I=${I}-1 done echo 【commit文】 echo 【DBコネクション切断】