Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「mmap」を含む日記RSS

はてなキーワード:mmapとは

2023-12-17

プログラミング初心者です。以下のコードの誤りはなんですか

僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています

以下のコードを実行してデータを追加し続けると、一定サイズを超えるとエラーが出てしまうみたいです。

理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。

もし詳しい人がいたらご教示お願い致します。

import sysimportosimportmmapimport hashlibdef h(x):    return int(hashlib.sha512(x.encode()).hexdigest(), 16)def create_db(filename):    withopen(filename, 'wb')as f:        f.write(b'\0' * 1024 * 1024)  # 1MBの空ファイル作成defset_key(filename,key,value):    withopen(filename, 'r+b')as f:mm =mmap.mmap(f.fileno(), 0)pos = h(key) %mm.size()        whilemm[pos:pos+1] != b'\0':pos = (pos + 1) %mm.size()            ifpos == h(key) %mm.size():f.seek(0,os.SEEK_END)                f.write(b'\0' *mm.size())  #ファイルサイズを2倍にするmm =mmap.mmap(f.fileno(), f.tell())  #ファイルサイズを反映させるpos = h(key) %mm.size()  #ハッシュ値を再計算する        data =key + '\0' +value + '\0'        data = data.encode()mm[pos:pos+len(data)] = datamm.close()  #mmapオブジェクトを閉じるdefget_key(filename,key):    withopen(filename, 'r+b')as f:mm =mmap.mmap(f.fileno(), 0)pos = h(key) %mm.size()        whilemm[pos:pos+1] != b'\0':            end =mm.find(b'\0',pos,mm.size())  # 第2引数と第3引数指定する            if end == -1:                end =mm.size()            ifmm[pos:end].decode() ==key:pos = end + 1                end =mm.find(b'\0',pos,mm.size())  # 第2引数と第3引数指定する                if end == -1:                    end =mm.size()value =mm[pos:end].decode()mm.close()  #mmapオブジェクトを閉じる                returnvaluepos = (pos + 1) %mm.size()            ifpos == h(key) %mm.size():                breakmm.close()  #mmapオブジェクトを閉じる        return Nonedefmain():    cmd = sys.argv[1]    if cmd == 'create':        create_db(sys.argv[2])    elif cmd == 'set':set_key(sys.argv[2], sys.argv[3], sys.argv[4])    elif cmd == 'get':print(get_key(sys.argv[2], sys.argv[3]))if __name__ == '__main__':main()

Permalink |記事への反応(0) | 12:13

このエントリーをはてなブックマークに追加ツイートシェア

2023-05-15

[ChatGPT]タイルを並列分散処理するところまで指摘してくれるなら20ドル払うけど(ソースコードは参考にはならないし…

User

Photoshopタイル構造はどのように実装したら良いですか?何か参考になるソースコードなどはありませんか?

ChatGPT

Photoshopタイル構造は、画像を小さな矩形のブロックに分割して、各ブロック個別に処理することで実現されます。これにより、大きな画像の処理を高速化することができます

一般的に、タイル構造アルゴリズムは以下のようになります

画像タイルに分割する

タイル個別に処理する

処理されたタイルを結合して、元の画像を再構築する

このアルゴリズム実装するには、以下のような手順が必要になります

画像を読み込む

タイルサイズを決定する

画像タイルに分割する

タイル個別に処理する

処理されたタイルを結合して、元の画像を再構築する

処理が完了したら、結果を保存する

以下は、Python実装された簡単タイル構造コード例です。この例では、画像を単純にグレースケール化しています

import numpyasnpfrom PILimportImage#画像を読み込むim =Image.open("input.jpg")#タイルサイズを決定するtile_size = 128#画像タイルに分割するtiles = []width, height =im.sizefor y in range(0, height, tile_size):    for x in range(0, width, tile_size):box = (x, y, x + tile_size, y + tile_size)        tile =im.crop(box)        tiles.append(tile)# 各タイル個別に処理するfor i, tile in enumerate(tiles):    tile = tile.convert("L")    tiles[i] = tile# 処理されたタイルを結合して、元の画像を再構築するoutput =Image.new("L", (width, height))x = 0y = 0for i, tile in enumerate(tiles):    output.paste(tile, (x, y))    x += tile_size    if x>= width:        x = 0        y += tile_size# 結果を保存するoutput.save("output.jpg")

このコードは、Pillowを使用して、画像の読み込み、タイルの分割、処理されたタイルの結合、結果の保存を行っています。このコードを改良することで、より高度な画像処理アルゴリズム実装することができます



User

回答ありがとうございますしかし、実際にはこれに拡大縮小、タイルを跨いでのコピーペーストペンツールでの描画などが加わります。拡大縮小は画像ピラミッドのようなものメモリ以上の巨大な画像を扱えるのはmmapを使っているのではないかと予想しています。これらを一言で回答するのは難しいと思いますが、何かアドバイスをいただけないでしょうか。よろしくお願いいたします。

ChatGPT

拡大縮小、タイルを跨いでのコピーペーストペンツールでの描画などを実装するためには、より高度なアルゴリズムテクニック必要になります

拡大縮小に関しては、画像ピラミッド使用することで実現できます画像ピラミッドは、複数解像度レベルで同じ画像表現する方法です。画像ピラミッド使用することで、拡大縮小のプロセス簡単かつ高速に行うことができますOpenCVやPillowなどのライブラリは、画像ピラミッドを構築するための機能提供しています

タイルを跨いでのコピーペーストは、オーバーレイ技術使用することで実現できますオーバーレイとは、複数画像を重ね合わせることで、新しい画像を生成する技術です。タイルを跨いでのコピーペーストは、オーバーレイ使用して、複数タイルを重ね合わせることで実現できます。また、透明度使用することで、重ね合わせたタイルの一部を透明にすることもできます

ペンツールでの描画に関しては、画像ピクセル単位での操作必要になります。これは、OpenCVやPillowなどの画像処理ライブラリ使用して実現できます画像ピクセル単位での操作には、色の変更、描画、消去などが含まれます。これらの操作を組み合わせることで、複雑な描画機能を実現することができます

最後に、メモリ以上の巨大な画像を扱うために、mmap使用することは可能です。mmap使用することで、ファイルメモリ上にマップし、ファイルと同じようにアクセスすることができます。これにより、ファイルメモリに収まらない場合でも、ファイルの一部をメモリマップし、必要な部分だけを読み書きすることができます。ただし、mmap使用する場合は、適切なメモリ管理必要であり、オーバーヘッドが発生する可能性があるため、十分なテストと調整が必要です。

Permalink |記事への反応(0) | 00:14

このエントリーをはてなブックマークに追加ツイートシェア

 
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp