1

これはおそらく大したことではありませんが、誰かがそれに対する良い解決策を知っているかもしれません.

序章

私は現在、html2各 OS (Safari/IE/Firefox/Konquerer/~) のネイティブ ブラウザーを継承する新しいライブラリを備えた新しい wxPython 2.9 を使用して Python でアプリケーションを作成していますが、これは非常に優れています。

目標/目的

私が現在目指しているのは、大量のデータを処理し、Python で超高速に分析することです (現在、約 110.000 エントリで、約 1.500.000 から 2.250.000 の結果が辞書になります)。これは非常に高速に動作し、動的でもあるため、最初の大きなフェッチを 1 回だけ実行し (約 2 ~ 4 秒かかります)、その後はディスクに新しいデータが作成された場合にリッスンし続けます。

ここまでは順調ですね。新しい wxPythonhtml2ライブラリを使用して、新しい GUI を作成しています。これは主にページを表示するために作成されているため、私が作成したのはフォルダー内のモデル/html/(HTML/CSS/jQuery を使用) であり、JSON ファイル (jQuery フェッチ) を動的に検索します。これは実質的に大量の完全なダンプです。 Python スクリプトが並列スレッドでバックグラウンド (デーモン) で作成している辞書。

JavaScript は大きな JSON ファイルの読み取りに問題があるようには見えません。また、CPU とメモリの使用率も非常に低くなります。

結論

しかし、ここでボトルネックが発生します。JavaScript の観点からは、大きな JSON ファイルの処理は実際には楽しいものではありません。取得する必要があるすべてのデータについて、多くの検索と照合を行う必要があり、また、エントリの同じ大きなチャンクを介して多くの冗長な再ループを作成します。

質問

Python と JavaScript の両方に実装され、jSON ファイル、または他のテキストベースのファイルをデータベースとして処理できる「エンジン」があるかどうか疑問に思っています。つまり、MySQL のような構造を実際に持つことができます (もちろん、完全に拡張するという意味ではありません)。少なくとも、データを保持するテーブル構造を定義し、体系的に読み取り/書き込み/更新を行うことができます。

私が現在開発しているアプリはマルチ OS ベースです (少なくとも Ubuntu、OS X、および Windows XP+)。また、(ディストリビューション/依存関係のために) wxPython を使用して (ローカルホストで MySQL サーバーを実行できるように) 拡張データベースを使用するよりも混乱を招きたくないので、純粋に Python ディストリビューションのフォルダー内に保管します。これは、ユーザーが既にサーバー/データベースを使用しているかどうかをチェックする大規模なコード (チェック) を作成するのを防ぐためでもあります。これは、インストールするアプリと衝突する可能性があります。


ファイナルノート

GUI を必要とする Python スクリプトのこの方法での開発を標準にするために、将来のプロジェクトのために何らかの API を自分で構築することを目指しています。wxPython が最新のブラウザー テクノロジをより簡単に採用できるようになったので、超高速で動的でレスポンシブなグラフィカル Python アプリを構築することに、もはや制限はないようです。

4

2 に答える 2

1

データを SQLite データベースに貼り付けてから、Python と Javascript の両方をヒットさせてみませんか? Python で JSON を SQLite に変換する - JSON キーをデータベース列に適切にマップする方法も参照してください。

Sqlite は、Python のすべての最新バージョンに含まれています。制限については、SQLite Web サイトを確認する必要があります。

于 2013-04-18T21:45:09.923 に答える
0

CGI HTTP サーバーを実行し、そこにある Python に JavaScript の AJAX 呼び出しに対する SQLite クエリを取得させることで、ちょっとしたことがわかりました。これは小さなデモです (OS X でのみテスト済み):

フォルダ構造

main.py
cgi/index.py
data/
html/index.html
html/scripts/jquery.js
html/scripts/main.js
html/styles/main.css

Python サーバー (main.py)

### CGI Server ###
import CGIHTTPServer
import BaseHTTPServer

class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
    cgi_directories = ['/cgi']

    # Mute the messages in the shell
    def log_message(self, format, *args):
        return

httpd = BaseHTTPServer.HTTPServer(('', 61350), Handler)
#httpd.serve_forever()
thread = threading.Thread(name='CGIHTTPServer', target=httpd.serve_forever)
thread.setDaemon(True)
thread.start()

#### TEST SQLLite ####
# Make the database file if it doesn't exist
if not os.path.exists('data/sqlite.db'):
    db_file = open('data/sqlite.db', 'w')
    db_file.write('')
    db_file.close()
import sqlite3
conn = sqlite3.connect('data/sqlite.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE info(id INTEGER UNIQUE PRIMARY KEY, name VARCHAR(75), folder_name VARCHAR(75))')
cursor.execute('INSERT INTO info VALUES(null, "something1", "something1_name")')
cursor.execute('INSERT INTO info VALUES(null, "something2", "something1_name")')
conn.commit()

Python SQLite プロセッサ (cgi/index.py) (デモは純粋に SELECT 用であり、より動的なものが必要です)

#!/usr/bin/env python
import cgi
import json
import sqlite3
print 'Content-Type: text/json\n\n'

### Fetch GET-data ###
form = cgi.FieldStorage()
obj = {}

### SQLite fetching ###
query = form.getvalue('query', 'ERROR')
output = ''

if query == 'ERROR':
    output = 'WARNING! No query was given!'
else:
    # WARNING: The path probably needs `../data/sqlite.db` if PYTHONPATH is not defined
    conn = sqlite3.connect('data/sqlite.db')
    cursor = conn.cursor()
    cursor.execute(query)
    # TODO: Add functionality/detect if it's a SELECT, INSERT/UPDATE (then we need to conn.commit() )
    result = cursor.fetchall()

    if len(result) > 0:
        output = []

        for row in result:
            buff = []

            for entry in row:
                buff.append(entry)

            output.append(buff)
    else:
        output = 'WARNING! No results found'

obj = output

### Return the data in jSON (map) format for JavaScript
print json.dumps(obj)

JavaScript (html/scripts/main.js)

'use strict';
$(document).ready(function() {
    // JSON data read test
    var query = 'SELECT * FROM test';

    $.ajax({
        url: 'http://127.0.0.1:61350/cgi/index.py?query=' + query,
        success: function(data) {
            lg(data);
        },
        error: function() {
            lg('Something went wrong while fetching the query.');
        }
    });
});

以上で終わりです。ブラウザのコンソール出力は次のとおりです。

[
    [1, "something1", "something1_name"],
    [2, "something2", "something2_name"]
]

この方法論を使用すると、Python と JavaScript が同じデータベースで読み取り/書き込みを行うことができる一方で、Python はシステム タスク (デーモン) を実行してデータベース エントリを更新し、JavaScript は新しいデータをチェックし続けることができます。

この方法はおそらく、リスナーや両者の間の他の通信手段のための余地を追加することもできます。

デーモンが原因で、main.pyは即座に実行を停止します。これは、アプリケーションが停止するまでデーモン (サーバー) を維持する wxPython スクリプトが原因です。他の誰かが将来のためにこのコードを使用したい場合; サーバーコードがSQLiteの開始後に実行されることを確認し、引用符を外しhttpd.serve_forever()て実行を維持してください。

于 2013-04-20T13:52:40.320 に答える