`
youngerblue
  • 浏览: 44152 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

sphinx+python 索引耗内存

 
阅读更多

搜索一直用的是coreseek,数据源方面用的是python,以前数据量少的时候没问题,数据量一大,用python建索引就出现问题。

未做优化前,python建索引的过程的第一步就是先捞出所有的数据放内存,这也是官网文档的做法,数据量一大,必然导致占用内存过大,导致进程终止或者服务器负载过高。

实际数据:200W,在执行python数据源时,内存达到2g以上。

优化后的数据:内存维持在427M,没有继续增长。

原先的python的代码把sql的查询都放在def Connected(self)方法,一次性全部查询出来后使用def NextDocument(self)遍历。

现把查询语句调到NextDocument(self)方法中。
基本思路如下:
1. 先查询出该表的最大id值
2.对查询进行分页,比如10页,limit = maxId/10
3.第一次执行NextDocument或者执行次数是limit 的倍数的时候,执行sql查询,把查询结果出分页结果集
4.循环遍历结果集
5.分页次数到达11页时,return False。

此方法基本可以保证大数据量下建索引没有内存问题。

 

分享到:
评论
2 楼 yangguangmeng 2016-12-02  
您好: 还请指点下,谢谢! 我是读取目录下文件中数据,怎么修改呢。 下面代码不好使,请赐教下,谢谢!

# -*- coding:utf-8 -*-
# coreseek3.2 python source
# author: HonestQiao
# date: 2010-06-03 11:46



def IsSubString(SubStrList,Str): 
    flag=True 
    for substr in SubStrList: 
        if not(substr in Str): 
            flag=False 
 
    return flag


'''
data/1.txt
data/2.txt
'''
def GetFileList(FindPath,FlagStr=[]):
    import os 
    FileList=[] 
    FileNames=os.listdir(FindPath) 
    if (len(FileNames)>0): 
       for fn in FileNames: 
           if (len(FlagStr)>0): 
               if (IsSubString(FlagStr,fn)): 
                   fullfilename=os.path.join(FindPath,fn) 
                   FileList.append(fullfilename) 
           else: 
               fullfilename=os.path.join(FindPath,fn) 
               FileList.append(fullfilename) 
 
    if (len(FileList)>0): 
        FileList.sort() 
 
    return FileList


class MainSource(object):
    def __init__(self, conf):
        self.conf =  conf
        self.idx = 0
        self.data = []

    def SetFile(self, filename):
        self.file = filename
   
    def GetScheme(self): 
        return [
            ('id' , {'docid':True, } ),
            ('subject', { 'type':'text'} ),
            ('context', { 'type':'text'} ),
            ('published', {'type':'integer'} ),
            ('author_id', {'type':'integer'} ),
        ]

    def GetFieldOrder(self):
        return [('subject', 'context')]
  
    def NextDocument(self):  
            if self.idx < len(self.data):
                item = self.data[self.idx]
                self.docid = self.id = item['id']
                self.subject = item['subject']
                self.context = item['context']
                self.published = item['published']
                self.author_id = item['author_id']
                self.idx += 1
                return True
            else:
                return False



    def Connected(self):             
        pass
              


       

if __name__ == "__main__":   
    conf = {}
    source = MainSource(conf)
    source.Connected()
  
    FileList = []
    FileList = GetFileList("data/")
    for file in FileList:
        f = open(file, 'rb')     
        print file      
        lines = f.readlines()   
        #print len(lines)
       
        i =1
        TP=""
        BT=""
        ID=""
   
        while i<= len(lines)/154:
            TP = lines[66+154*(i-1)].strip('\n').decode('gbk').encode('utf-8')[1:]
            BT = lines[84+154*(i-1)].strip('\n').decode('gbk').encode('utf-8')[1:]
            ID = lines[92+154*(i-1)].strip('\n').decode('gbk').encode('utf-8')[2:]
            i = i+1
           
            if TP!="" and BT!="" and ID!="":
                source.data.append({'id':int(ID), 'subject':BT,'context':TP, 'published':int(100001), 'author_id':int(100001)})
                TP=""
                BT=""
                ID=""
           
        f.close()
          
    while 1:
        if source.NextDocument():
            #print "id=%d, subject=%s" % (source.docid, source.subject)
            continue
        else:
            break
    
#eof



1 楼 muzi1012 2012-09-15  
你好,我现在用python做数据源,建索引出来的文件才1k、0k大小,是不是有问题啊?
E:\GeoSearch\bin>indexer -c /GeoSearch/etc/scgeo.conf --all
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.

using config file '/GeoSearch/etc/scgeo.conf'...
indexing index 'scgeo'...
WARNING: Attribute count is 0: switching to none docinfo
collected 99 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 99 docs, 891 bytes
total 6.113 sec, 145 bytes/sec, 16.19 docs/sec
total 1 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 6 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

建索引操作提示这样的,能帮忙看下什么原因吗?网上找好久也没眉目,谢谢了

相关推荐

    Sphinx+Python+Oracle构建全文检索系统.zip

    同时,Sphinx提供了Python API,使得我们可以用Python来控制Sphinx的索引构建和查询操作。 3. Oracle:Oracle是一款企业级的关系型数据库管理系统,能够处理大规模的数据存储和复杂的事务处理。在全文检索系统中,...

    基于Sphinx+MySql+Python的站内搜索引擎的设计与实现.zip

    5. 搜索性能优化:通过调整Sphinx配置,如内存分配、索引碎片整理等,提升搜索速度。 此外,我们还需要关注系统的可扩展性和维护性。随着数据量的增长,可能需要分布式部署Sphinx以提高处理能力。同时,系统应具有...

    基于Sphinx+MySql+Python的站内搜索引擎的设计与实现.pdf

    在全文搜索引擎的构建中,Python可以用来编写处理逻辑、调用Sphinx API以及其他后端任务。 4. 站内搜索引擎设计目标与系统构架: 设计目标包括构建一个可以搜索站内所有公开信息的全文检索搜索引擎,并提供基于Web...

    sphinx+mysql 安装手册

    1. **高速索引**:Sphinx能够快速地处理大量数据进行实时索引。 2. **高效率查询**:查询响应时间通常在毫秒级别,提高了用户体验。 3. **灵活的查询语法**:支持布尔、短语、前缀、范围、邻近等多种查询类型。 4. *...

    sphinx+xdict+安装说明.zip

    1. **环境准备**:首先确保你的系统已经安装了Python环境,因为Sphinx是基于Python开发的。你可以通过Python的pip工具来管理依赖。 2. **下载Sphinx源码**:从Sphinx的官方仓库或者通过Git克隆获取最新的Sphinx源...

    基于Coreseek+Python的分布式全文检索方法.zip

    2. **索引构建**:通过Python调用Coreseek的API,将预处理后的数据导入到Coreseek索引中。 3. **查询接口**:编写Python脚本,实现用户输入查询,与Coreseek通信并返回结果。 4. **结果处理**:Python可以方便地解析...

    基于Coreseek+Python的分布式全文检索方法.pdf

    5. **关键词和分类**:文中列出了关键词如搜索引擎、Coreseek全文检索、分布式、Python数据源程序接口,以及相应的中图分类号和文献标识码,方便了学术研究和分类索引。 ### 总结 综上所述,文档“基于Coreseek+...

    sql全文索引 sphinx

    为了保持最佳性能,需要定期检查和优化Sphinx配置,如调整内存分配、优化索引结构、监控系统资源使用情况等。 总之,Sphinx作为SQL全文索引工具,通过高效的全文索引和搜索机制,提升了数据库的查询效率,为企业级...

    Python-这是一个Sphinx文档生成器

    Sphinx 就是一个专为编写技术文档而设计的强大工具,尤其在 Python 开发社区中被广泛使用。本篇将详细介绍Sphinx及其在Python项目文档生成中的应用。 Sphinx 是一个基于 Python 的文档生成器,它能够轻松地将文本...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.

    ⑷、“主索引+增量索引”更新方式: 4 ⑸、“Ext3文件系统+tmpfs内存文件系统”相结合: 4 ⑹、中文分词词库: 5 二、MYSQL+SPHINX+SPHINXSE安装步骤: 5 1、安装python支持 5 2、编译安装LibMMSeg 5 3、编译安装...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)[收集].pdf

    - “主索引+增量索引”更新方式:主索引包含所有数据,增量索引仅记录新增或修改的数据,结合使用可平衡性能和资源消耗。 - “Ext3文件系统+tmpfs内存文件系统”相结合:利用tmpfs的高速读写特性,将部分索引...

    使用 Sphinx 和 Django 进行全文搜索的透明层_Python

    3. 创建Sphinx索引:根据Django的模型定义,生成对应的Sphinx索引。 4. 启动Sphinx服务:运行Sphinx的searchd进程,监听查询请求。 5. 集成Django-Sphinx:在Django的模型上应用`sphinx_search`装饰器,将模型与...

    CoreSeek/Sphinx中文手册

    Sphinx支持多种数据源,如SQL、xmlpipe、Python等,每种数据源都有其特定的索引方式和配置选项。索引可以是静态的,也可以是实时更新的,还可以通过合并多个小索引来创建一个大索引。 RT(Real-time)索引提供了一...

    PHP搜索引擎Sphinx使用教程.zip

    3. **MySQL与Sphinx的整合**:Sphinx可以与MySQL协同工作,通过MySQL作为数据源,Sphinx负责构建和维护索引,提供快速的搜索。文件名“PHP+Sphinx+Mysql做搜索引擎_lj详细.doc”和“PHP+MySQL+SPHINX安装配置与测试 ...

    Sphinx搜索引擎架构与使用文档(和MySQL结合).pdf

    - **“主索引+增量索引”更新方式**:主索引包含所有数据,增量索引只记录新增或更新的内容,这样在保持搜索效率的同时,减少了索引更新的开销。 - **“Ext3文件系统+tmpfs内存文件系统”相结合**:利用tmpfs的...

    使用sphinx生成API文档

    Sphinx是一种强大的文档生成工具,尤其适合于Python项目。它能够自动生成清晰、美观且结构化的文档,并支持多种输出格式(如HTML、PDF等)。本文档将详细介绍如何使用Sphinx来为Python项目创建API文档。 #### 二、...

    sphinx支持discuz包

    4. **构建和更新索引**:运行Sphinx命令行工具,对论坛数据进行初次索引,并设置定期自动更新。 5. **集成API**:在Discuz! 后台或插件中调用Sphinx的API,实现搜索功能的接入。 6. **测试和优化**:进行实际搜索...

    (word完整版)Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.doc

    - **“主索引+增量索引”更新方式**:主索引包含所有数据,增量索引只记录新增或修改的数据,结合使用减少全量重建索引的开销。 - **“Ext3 文件系统+tmpfs 内存文件系统”相结合**:利用 Ext3 提供持久性存储,...

    张宴Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.doc

    5. **“主索引+增量索引”更新方式**:为了实时反映数据变化,采用主索引加增量索引的方式。主索引保存所有数据,增量索引则捕获最新的变化,两者结合保证了搜索结果的实时性和准确性。 6. **“Ext3文件系统+...

    数据库 搜索引擎 sphinx

    3. **高性能**: Sphinx采用内存中的索引结构,极大地提高了搜索速度。它可以在数百万条记录中查找匹配项,几乎瞬间返回结果,提供优秀的用户体验。 4. **灵活的查询语法**: Sphinx支持复杂的布尔查询、短语查询、...

Global site tag (gtag.js) - Google Analytics