Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 建立SQLite数据库进行聚类分析_Python_Sqlite_Cluster Analysis_Database Performance - Fatal编程技术网

Python 建立SQLite数据库进行聚类分析

Python 建立SQLite数据库进行聚类分析,python,sqlite,cluster-analysis,database-performance,Python,Sqlite,Cluster Analysis,Database Performance,我对数据库一无所知。我想获得一些关于如何为聚类分析和主题建模任务设置和使用SQLite数据库的建议 我有一个2GB的文件,其中每一行都是一个json对象。以下是文件中的json对象示例: {"body": "Heath Ledger's Joker...", "subreddit_id": "t5_2qh3s", "name": "t1_clpmhgo", "author": "l3thaln3ss", "created_utc": "1414799999", "subreddit": "mov

我对数据库一无所知。我想获得一些关于如何为聚类分析和主题建模任务设置和使用SQLite数据库的建议

我有一个2GB的文件,其中每一行都是一个json对象。以下是文件中的json对象示例:

{"body": "Heath Ledger's Joker...", "subreddit_id": "t5_2qh3s", "name": "t1_clpmhgo", "author": "l3thaln3ss", "created_utc": "1414799999", "subreddit": "movies", "parent_id": "t3_2kwdi3", "score": 1, "link_id": "t3_2kwdi3", "sub_type": "links - high"}
我创建了一个SQLite数据库,如下所示:

import json
import sqlite3
import sys

def main(argv):
    if len(argv) != 2:
        sys.exit("Provide a database name.")

    dbName = argv[1]
    db = sqlite3.connect(dbName)

    db.execute('''CREATE TABLE IF NOT EXISTS Comments
              (name text primary key,
               author text,
               body text,
               score integer,
               parent_id text,
               link_id text,
               subreddit text,
               subreddit_id text,
               sub_type text,
               created_utc text,
               foreign key (parent_id) references Comment(name));''')

    db.commit()
    db.close()

if __name__ == "__main__":
    main(sys.argv)
import json
import sqlite3
import sys

def main(argv):
    if len(argv) != 2:
        sys.exit("Provide a comment file (of json objects) name.")

    fname = argv[1]

    db = sqlite3.connect("commentDB")
    columns = ['name', 'author', 'body', 'score', 'parent_id', 'link_id', 'subreddit', 'subreddit_id', 'sub_type', 'created_utc']

    query = "insert or ignore into Comments values (?,?,?,?,?,?,?,?,?,?)"

    c = db.cursor()

    with open(fname, 'r') as infile:
        for comment in infile:
            decodedComment = json.loads(comment)
            keys = ()
            for col in columns:
                keys += (decodedComment[col],)
            print str(keys)
            print
            c.execute(query, keys)

    c.close()
    db.commit()
    db.close()


if __name__ == "__main__":
    main(sys.argv)
这是数据库的良好初始设置吗

我正在填充数据库,如下所示:

import json
import sqlite3
import sys

def main(argv):
    if len(argv) != 2:
        sys.exit("Provide a database name.")

    dbName = argv[1]
    db = sqlite3.connect(dbName)

    db.execute('''CREATE TABLE IF NOT EXISTS Comments
              (name text primary key,
               author text,
               body text,
               score integer,
               parent_id text,
               link_id text,
               subreddit text,
               subreddit_id text,
               sub_type text,
               created_utc text,
               foreign key (parent_id) references Comment(name));''')

    db.commit()
    db.close()

if __name__ == "__main__":
    main(sys.argv)
import json
import sqlite3
import sys

def main(argv):
    if len(argv) != 2:
        sys.exit("Provide a comment file (of json objects) name.")

    fname = argv[1]

    db = sqlite3.connect("commentDB")
    columns = ['name', 'author', 'body', 'score', 'parent_id', 'link_id', 'subreddit', 'subreddit_id', 'sub_type', 'created_utc']

    query = "insert or ignore into Comments values (?,?,?,?,?,?,?,?,?,?)"

    c = db.cursor()

    with open(fname, 'r') as infile:
        for comment in infile:
            decodedComment = json.loads(comment)
            keys = ()
            for col in columns:
                keys += (decodedComment[col],)
            print str(keys)
            print
            c.execute(query, keys)

    c.close()
    db.commit()
    db.close()


if __name__ == "__main__":
    main(sys.argv)
最终,我将基于评论中共享的频繁词对subreddit进行聚类,用户在哪里评论,以及通过分析subreddit评论中发现的词而获得的主题模型的差异。请注意,我还有更多的2GB文件需要处理,因此理想情况下,解决方案应该具有相对可扩展性。任何关于如何设置(特别是通过改进我所写的内容)数据库以完成此类工作的一般性建议都将不胜感激

谢谢


编辑:删除了有关插入性能的问题。

一些小的改进建议了他们自己——例如,
注释的
创建表
有一个
引用注释(名称)
,我很确定
注释
是一个拼写错误,您的意思是
注释
(因此您发布的代码不会工作)

从速度上看,将特殊命名的
构建为
元组
有些浪费--
列表
会更好,也就是说,替换

        keys = ()
        for col in columns:
            keys += (decodedComment[col],)

为了获得更好的性能(可能没有明确的文档记录,但是游标的
execute
方法使用了第二个参数,这是一个列表,与使用元组一样令人高兴)

但总的来说,您有一个良好的开端——并且在接收单个2GB输入文件后应该会很好然而,sqlite在许多方面都非常棒,但它并不能很好地扩展到该大小的倍数——为此,您需要一个“真正的”数据库。我推荐
PostgreSQL
,但可能
MySQL
(及其变体,如
MariaDB
)和商业(非开源)产品也可以

如果你所说的“更多”(2GB文件)是指数百或数千个,那么即使是“严肃”的专业DBs也可能在某个时候开始在接缝处发出吱吱声,具体取决于你打算对它们进行什么处理;提到“注释中的每一个单词”(意味着我想象
body
字段需要被处理——词干&c——到一个单词集合中)是有点令人担忧的,因为它预示着将要进行非常繁重的处理


一旦这成为一个问题,“NoSQL”产品,或是那些想要扩大规模的东西,比如BigQuery,可能值得你花点时间。然而,对于小规模的实验,您肯定可以从sqlite开始,并使用它来开发您心目中的“集群”算法;然后放大到PostgreSQL或其他任何东西,以检查这些中等规模的扩展是如何工作的;只有在这一点上,如果需要的话,考虑额外的工作来考虑非关系的解决方案,这些解决方案虽然非常强大,但往往需要对某些访问模式的承诺(关系DBS,其中最需要的是添加索引,可能更适合于更多的实验阶段播放!)传统的SQL和NoSQL数据库对于这种分析不是特别有用。缺乏允许获得良好相似性的能力,或者缺乏根据聚类算法的需要加速查询的能力

在最实际的应用中,您将得到如下工作流:

  • 将数据库中的数据加载到分析应用程序中(通常通过将其转储为某种CSV格式)
  • 进行分析
  • 将结果写回数据库
  • 这既不美观也不高效,肯定会让你失望。但考虑到即使在商业报价中也缺乏分析灵活性,这就是我们所能做到的。甚至在一些商业产品中提供的分析功能——其中有足够的功能——通常也是这样工作的


    在您的特定用例中,可以使用Lucene作为支持数据库。如果您有一个可以通过Lucene查询来加速的集群算法和实现,那就是。

    请参阅。不要在每次插入后提交。取而代之的是获取一次游标,然后循环并插入,并在插入完成后提交一次。@LukasGraf:谢谢您的参考。我已经修正了我的承诺,这是更有效的。关于设置数据库,我的另一个一般性问题仍然存在。您的设置本身没有什么问题,但是您的问题的可伸缩性方面非常广泛,它不太适合StackOverflow的Q&a格式。没有人能够预测您的设置(以及进行分析的代码!)将如何扩展,因此在这里几乎不可能给出正确的答案。您应该从您拥有的开始,如果遇到性能问题,请使用可用的工具确定问题所在,或者就SO提出一个新的特定问题。SQLite本身可能无法很好地扩展该数据量。您可能希望直接使用(只是核心,而不是ORM)而不是DBAPI来编写从特定数据库后端抽象出来的代码,然后在达到极限时从SQLite切换到“真正的数据库”。另一件事是:甚至可能关系数据库仍然不适合这种任务。您可能希望研究如何将数据索引到集群中,并使用集群引擎来进行集群。感谢这一非常有用的响应(并捕捉到错误)。这给了我一个前进的好主意,也给了我前进的方向。关于评论体的处理:我需要制作每个评论的术语直方图。用表格中的单词直方图(比如一本字典,单词作为键,它们的计数作为值)替换每条注释的正文是否可行?还有,什么是“词干与c”?@Dimitrios,“d”