1

这可能有点牵强,但也许有人知道一个好的解决方案。

介绍

我目前正在使用新的 wxPython 2.9 在 Python 中制作应用程序,它具有新的html2库,它将继承每个操作系统的本机浏览器(Safari/IE/Firefox/Konquerer/~),这真的很棒。

目标/目的

我目前的目标是处理大量数据并使用 Python 超快速地对其进行分析(目前大约有 110.000 个条目,在字典中产生大约 1.500.000 到 2.250.000 个结果)。这工作得非常快而且也是动态的,所以它只会做第一次大提取一次(只需要大约 2-4 秒),然后如果在磁盘上创建了新数据,它就会继续监听。

到目前为止,一切都很好。现在有了新的 wxPythonhtml2库,我正在制作新的 GUI。它主要用于显示页面,所以我现在制作的是/html/文件夹中的模型(使用 HTML/CSS/jQuery),它会动态查找 JSON 文件(jQuery 获取),这实际上是海量文件的完整转储Python 脚本在并行线程的后台(守护进程)中创建的字典。

JavaScript 在读取大的 JSON 文件时似乎没有问题,而且因为一切都是(并且保持)本地的,所以它不会真正导致缓慢或任何事情。CPU和内存使用率也很低。

结论

但瓶颈来了。从 JavaScript 的角度来看,处理大的 JSON 文件并不是一件轻松的事。我必须对需要获取的所有数据进行大量搜索和匹配,并且还会在相同的大块条目中创建大量冗余的重新循环。

问题

我想知道是否有任何一种为 Python 和 JavaScript 实现的“引擎”可以处理 JSON 文件,或者其他基于文本的文件作为数据库。这意味着你真的可以拥有一个类似 MySQL 的结构(当然不是完全扩展),你至少可以定义一个保存数据的表结构,并且你可以有条不紊地进行读/写/更新。

我目前正在开发的应用程序是基于多操作系统的(至少是 Ubuntu、OS X 和 Windows XP+)。我也真的不想创建比使用 wxPython(出于分发/依赖关系)使用扩展数据库(就像我可以在 localhost 上运行 MySQL 服务器)更混乱的情况,所以纯粹将它保存在我的 Python 发行版文件夹中。这也是为了防止编写大量代码(检查)检查用户是否已经使用了可能与我随后安装的应用程序发生冲突的服务器/数据库。


最后的笔记

我的目标是自己也为未来的项目构建某种 API,以便为需要 GUI 的 Python 脚本制定这种开发标准。现在 wxPython 可以更轻松地拥抱现代浏览器技术;构建超级快速、动态和响应迅速的图形 Python 应用程序似乎不再有任何限制。

4

2 回答 2

1

为什么不直接将数据粘贴到 SQLite 数据库中,然后让 Python 和 Javascript 都使用它呢?另请参阅在 Python 中将 JSON 转换为 SQLite - 如何将 json 键正确映射到数据库列?

Sqlite 包含在所有现代版本的 Python 中。您必须查看 SQLite 网站以了解其限制

于 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) (demo 纯粹用于 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 回答