• 締切済み

DBMの容量制限

Head_Syndicateの回答

回答No.1

perldoc AnyDBM_Fileでも、5.6.0で配布されているソース見ても、 制限は1024でしたよ。4096はdirの方ではないですか。

dany
質問者

補足

http://www.din.or.jp/~abe/Perl5Man/AnyDBMFile.3pm.html これによるとSDBMにはデフォルト「1k」で再定義可能 のようですね。といってもプロバイダなのでroot権限もって ないからどうしようもないのですが。^^; しかしNDBMは「4k」とあるのですが、これは1レコードのサイズ とは違うのでしょうか? NDBMでもうまくいかないのです。

関連するQ&A

  • DBファイルが0644になってしまう

    Linuxで perl5.005_03 + AnyDBM_FileでDBを作ろうとしているのですが、 作成された DBのファイルパーミッションが「0644」になってしまいます。 「0444」だと意味はありませんが正しく設定されます。 「0777」だと「0744」になりました。 以下のようにやっているのですが、何が間違えているのでしょう。 それとも操作に関しての権限が「0666」になるだけで、実際のファイル パーミッションは後から変更しないといけないのでしょうか? ---------------------------------- use Fcntl; use Config; use AnyDBM_File; $flags = O_CREAT | O_RDWR | &BINARY; tie( %HASH, AnyDBM_File, dbmfile, $flags,0666 ) || die "Can't open DB\n"; ~処理~ untie( %HASH ); sub BINARY{ return O_BINARY if $Config{osname} =~ /^(MS)?Win/; }

    • ベストアンサー
    • Perl
  • DBMのことで・・・

    現在DBMを用いて簡単なデータベースを作成しています。 どこぞのCGIゲームのように、リアルタイムにデーターベースの内容が書き換えられる(戦闘をすればお金がプラス等)ようにしたいのですが、うまくいきませんorz #!/usr/bin/perl use AnyDBM_File; use Fcntl; print "Content-type: text/html\n\n"; dbmopen(%DBM, 'id', 0666); $DBM{"baka"} = ("0<>1<>2<>"); dbmclose(%DBM); print<<"HTMLTAG"; DBを作成しました HTMLTAG tie %DBM,AnyDBM_File,"id",O_RDONLY,0666; @aaa = split(/<>/,$DBM{"baka"}); untie %DBM; print"$aaa[0]"; $aaa[0]++; とりあえずこのスクリプトで、ブラウザの更新をおすたびに表示される数字が1あがっていく(プラスされて書き換えられる)ようにしたいのですが・・・ 多分ですがゲーム等の場合、いちいちdbmopenで書き換えてないとおもうので、その方法を知りたいというわけです。 いちおうこの段階ではDB作成、DBの読み込みと表示はできています。 ご教授おねがいします。

  • O_CREAT、O_TRUNC、O_WRONLYはどうして512、1024、1になる?何進数表示?

    Win2k+cygwinの環境です。 #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> int main(void){ int c,i,t,w; c=O_CREAT,t=O_TRUNC,w=O_WRONLY; i=(O_WRONLY | O_CREAT | O_TRUNC); printf("c=%d,t=%d,w=%d,i=%d\n",c,t,w,i); return 0; } を実行すると $ ./test c=512,t=1024,w=1,i=1537 となりました。 /cygwin/usr/include/bits/fcntl.hには #define O_ACCMODE 0003 #define O_RDONLY 00 #define O_WRONLY 01 #define O_RDWR 02 #define O_CREAT 0100 /* not fcntl */ #define O_EXCL 0200 /* not fcntl */ #define O_NOCTTY 0400 /* not fcntl */ #define O_TRUNC 01000 /* not fcntl */ #define O_APPEND 02000 #define O_NONBLOCK 04000 #define O_NDELAY O_NONBLOCK #define O_SYNC 010000 #define O_FSYNC O_SYNC #define O_ASYNC 020000 #ifdef __USE_GNU # define O_DIRECT 040000 /* Direct disk access. */ # define O_DIRECTORY 0200000 /* Must be a directory. */ # define O_NOFOLLOW 0400000 /* Do not follow links. */ となっていまして、どうして c=512,t=1024,w=1,i=1537 になるのか分かりません。8進数表になっているのかと推測して #define O_CREAT 0100 よりこれは Ox0100 (8進数表示での0100)の意味なので10進数表示に変換してみましたら 64 となって辻褄が合いません。 #define O_TRUNC 01000 に於いても Ox01000→512 #define O_WRONLY 01 に於いては Ox01→1 でこれだけは実行結果と一致しています。 どうして c=512,t=1024,w=1,i=1537 となるのでしょうか?

  • C言語によるBerkeley DB アクセスでエラー

    FreeBSD 6.1でC言語によるプログラムを書いています。 ここでデータベースにBerkeley DBを使用しているのですがputで引数エラーが出ます。 以下テストプログラムです。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <limits.h> #include <db.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main() { DB* db; DBT key, val; memset(&key, 0, sizeof(DBT)); memset(&val, 0, sizeof(DBT)); key.data = (char *)"key"; key.size = strlen((char *)key.data); val.data = (char *)"データです。"; val.size = strlen((char *)val.data); if((db = dbopen("test.db", O_CREAT | O_RDWR, 644, DB_BTREE, NULL)) == NULL) { perror("dbopen"); exit(1); } if(db->put(db, &key, &val, R_SETCURSOR) == -1) { perror("put"); exit(1); } if(db->close(db) == -1) { perror("close"); exit(1); } } 結果:put: Invalid argument マニュアルやGoogleのソースコード検索等をして調べてみたのですが、どうしても解決できません。 お分かりになる方、ぜひ御教示お願いします。

  • cの標準関数openでNo such a file or directoryが起こっている状況について

    以下のプログラムでエラーとなる要因はどこにあるのでしょうか? #include <fcntl.h> #include <sys\stat.h> #include <sys\types.h> #include <string.h> #include <errno.h> char fname01[64]; //グローバル変数 ここからが、エラーになるプログラム ↓ fh_out = open( &fname01[0], O_CREAT|O_WRONLY|O_BINARY , S_IREAD|S_IWRITE );   if (fh_out == -1){ Application->MessageBox( strerror(errno) , " エラー", MB_OK | MB_ICONEXCLAMATION); ブレイクして、fname01を見た値。c:\\TEST\\d050_g10s187mv174av96bv16.bmp\0

  • C言語 エラーチェックについて

    初めまして。分からないところがあったので質問させていただきます。 以下のプログラムは引数から値を取得し、その値で生データの切り出しを 行うプログラムです。 read関数のところなのですが、argv[1]に格納されたファイル(パス名)が0byteでもエラーが出力されずに、コンパイルされてしまいます。 どうすればよいのでしょうか? さらに、上司にreadとwriteにエラーチェックのメッセージをつけろ。と言われたのですが、どうやれば良いのかよく分かりませんでした。if()~とすれば良いのでしょうか?初心者なので分かりにくい質問かと思いますが、どうぞよろしくお願いします。 #pragma warning ( disable : 4996 ) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <sys/stat.h> #define ONESEGSIZE 2048 void main ( argc, argv ) int argc; char *argv[]; { int fd, fd2; // ファイルハンドル int segment; // 列数 int raw_n; // 切り出す生データの数 int tviews; // 総ビュー数 int start_view; // 切り出し開始ビュー int size_view; // 切り出しサイズ int pitch_view; // 切り出しピッチ char *Rawdivit; // コマンド char *raw_file; // 生データファイル名 char *outraw_file; // 生データ出力ファイル名 char *mem; // メモリ変数 /* パラメータの個数チェック */ if ( argc != 9 ) { printf( "usage : Rawdivit raw_file outraw_file segment raw_n" " tviews start_view size_view pitch_view \n" ); exit ( 1 ); } /* 引数の取得char型 */ Rawdivit = argv[0]; raw_file = argv[1]; outraw_file = argv[2]; /* 引数の取得int型 */ segment = atoi ( argv[3] ); raw_n = atoi ( argv[4] ); tviews = atoi ( argv[5] ); start_view = atoi ( argv[6] ); size_view = atoi ( argv[7] ); pitch_view = atoi ( argv[8] ); /* 生データファイルオープン */ fd = open ( raw_file, O_RDONLY | O_BINARY ); if ( fd == -1 ) { printf ( "Fileopen error : read\n" ); exit ( -1 ); } /* 生データ読み込み用メモリ確保 */ mem = ( char * ) malloc ( ONESEGSIZE * segment * size_view ); // 単位 = byte if ( mem == NULL ) { printf ( "Memorysecure error\n" ); exit ( -1 ); } /* 切り出し開始位置までファイルポインタをシーク */ lseek ( fd, ONESEGSIZE * segment * start_view, SEEK_SET ); /* 切り出しサイズ分読み込み */ read ( fd, mem, ONESEGSIZE * segment * size_view ); /* 出力ファイルオープン */ fd2 = open ( outraw_file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IREAD | S_IWRITE ); if ( fd2 == -1 ) { printf ( "Fileopen error : write\n" ); exit ( -1 ); } /* 読み込んだデータを出力ファイルに書き込み */ write ( fd2, mem, ONESEGSIZE * segment * size_view ); /* メモリの開放 */ free ( mem ); /* ファイルクローズ */ close ( fd ); close ( fd2 ); exit ( 0 ); }

  • DBMについて教えてください

    最近切り替えたレンタルサーバーのサポートページで始めてDBMという言葉を知りました。 簡易的なデータベースライブラリ(そもそも、このライブラリという意味もよく・・)なのかな?となんとなく想像してるのですが、実際にどれくらいの規模のものなのか、まったく手がかりがつかめないでいます。 いろいろ検索してまわったのですが、実用するにはどうすればいい、そもそもこういうものである、などの入門の入門的なドキュメントは発見できずじまいでした。 これをうまくcgiで使うと、もしかして、データの管理(例えば、投稿してもらった小説などでも)が凄く簡潔になるのでは!?未知の世界が待っているのでは!?と実体を知らないだけに、どんどん幸せな事ばかり想像してしまっています。。(^^; どうか、DBMについてわかりやすいご説明(もしくは参考になるサイト)、こんな事ができるよ、など教えていただけないでしょうか! もう、気になって気になって・・・ よろしくお願いします。 補足: 現在のわたしの知識は、 .linux→MACにインストールしてちらっと触った程度  ・Perl→既存の掲示板などのcgiに機能をちょっとカスタマイズする程度 です。 レンタルサーバーのHPには、DBMはGDBM_File・DB_File・ SDBM_File・NDBM_Fileのどれかを使ってください、といった内容がかかれていました。

    • ベストアンサー
    • CGI
  • dbmについて

    0dbmは電圧で何Vでしょうか? その時の負荷は50Ω?75Ω?で計算するの? dbmのmはなんの意味でしたっけ? 忘れてしまいました。誰か教えて下さい。

  • dBmの読み方は何と読みますか?

    たまにdBmという単位を見かけるのですがこれって何と読むのでしょうか? デシベルエム? ディービーエム? そもそもmって何の頭文字なのでしょうか?

  • [ASP.NET] Web.configからの値取得

    ASP.NET(VBを利用)についてお尋ねいたします。 小さなプロジェクトを新規に作成し、 「web.config」の中で <configuration> <appSettings> <add key="connStr" value="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=XX;Initial Catalog=Northwind;Data Source=RED;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=RED;Use Encryption for Data=False;Tag with column collation when possible=False" /> </appSettings> <system.web> (以下略) と記載。 **.aspx.vbのほうでここで記載したkeyの値を取得し、**.aspxのラベルに出力したいと思ったのですが どうしたらいいでしょうか? 「**.aspx.vb」 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim aa As New AppSettingsReader Dim str As String = "connStr" Dim st As System.Type st = aa.GetType()     'Label1.Text = aa.GetValue(str, st)     ??    End Sub また、このkeyを同一ソリューションの中の複数プロジェクトで利用したいときは、うえのような記述(web.config)でよいでしょうか? このkeyにDBサーバーへの接続文字列を記載して同一ソリューションの各プロジェクトで利用したいと思っているのですがうまくいかず困っています。 アドバイスまたは小さなサンプルでもよいので教えていただけませんか? お願いいたします。