对于非常大的元组/文件/数据库记录/numpy.ndarray,linux“更多”类似于python中的代码?
Posted
技术标签:
【中文标题】对于非常大的元组/文件/数据库记录/numpy.ndarray,linux“更多”类似于python中的代码?【英文标题】:linux "more" like code in python for very big tuple/file/db records/numpy.darray? 【发布时间】:2010-09-29 09:57:54 【问题描述】:我正在寻找用于处理元组/csv 文件/sqlite db 记录/numpy.darray 中的大量记录的缓冲区代码,该缓冲区可能就像 linux 命令“更多”。
请求来自处理大量数据记录(可能是100000000行),记录可能如下所示:
0.12313 0.231312 0.23123 0.152432
0.22569 0.311312 0.54549 0.224654
0.33326 0.654685 0.67968 0.168749
...
0.42315 0.574575 0.68646 0.689596
我想在 numpy.darray 中处理它们。例如,找到特殊数据对其进行处理并将其存储回来,或者处理 2 列。但是它太大了,如果 numpy 直接读取文件,它会给我一个内存错误。
然后,我认为像mem缓存页面或linux“更多文件”命令这样的适配器可能会在处理时节省内存。
因为这些原始数据可能呈现为不同的格式 - csv / sqlite_db / hdf5 / xml。我希望这个适配器更加规范化,那么,使用“[]”作为“行”可能是一种更常见的方式,因为我认为每个记录都可以表示为一个[]。
所以我想要的适配器可能是这样的:
fd = "a opend big file" # or a tuple of objects, whatever, it is an iterable object can access all the raw rows
page = pager(fd)
page.page_buffer_size = 100 # buffer 100 line or 100 object in tuple
page.seek_to(0) # move to start
page.seek_to(120) # move to line #120
page.seek_to(-10) # seek back to #120
page.next_page()
page.prev_page()
page1 = page.copy()
page.remove(0)
page.sync()
有人可以告诉我一些提示以防止重新发明***吗?
顺便提一下,ATpy,http://atpy.sourceforge.net/ 是一个模块,可以将 numpy.array 与不同格式的原始数据源同步,但是,它也可以将所有数据读取到内存中。
到目前为止,pytable 不适合我,因为它不支持 SQL,而且 HDF5 文件可能不如 sqlite db 受欢迎(如果有错误请见谅)。
My plan is write this tools in this way:
1. helper.py <-- define all the house-keeping works for different file format
|- load_file()
|- seek_backword()
|- seek_forward()
| ...
2. adapter.py <-- define all the interface and import the helper to interact
with raw data and get a way to interact with numpy.darray in somehow.
|- load()
|- seek_to()
|- next_page()
|- prev_page()
|- sync()
|- self.page_buffer_size
|- self.abs_index_in_raw_for_this_page = []
|- self.index_for_this_page = []
|- self.buffered_rows = []
谢谢,
Rgs,
KC
【问题讨论】:
你想做什么? Python 的文件 IO 已经被缓冲了。 请不要写“添加”和“更新”。堆栈溢出维护所有更改的完整日志。请修正问题,使其完整且易于搜索的人阅读。请专注于使问题正确。不要玩弄“变更控制”,它已经为您完成了。 【参考方案1】:Ummmm....您实际上只是在谈论一个列表。
fd = open( "some file", "r" )
data = fd.readlines()
page_size = 100
data[0:0+page_size] # move to start
data[120:120+page_size] # move to line 120
here= 120
data[here-10:here-10+page_size] # move back 10 from here
here -= 10
data[here:here+page_size]
here += page_size
data[here:here+page_size]
我不确定你是否真的需要发明任何东西。
【讨论】:
谢谢,我正在 numpy.darray sqlite 之间编写一个适配器,用于非常大的数组处理而不会出现内存溢出 @K. C:这个“numpy.darray sqlite 之间的适配器”是什么意思?这是属于问题的更多信息吗? @S.Lott,假设我有一个非常大的(1000000000 条记录)表存储在 sqlite DB 中,我可以使用 python 中的 sqlite 模块从具有可迭代行对象的数据库中获取数据,但是如果我想要将整个表处理为 numpy.darray,它会给我一个内存错误,因为记录太多。我google了一下,发现有两种方法可以解决这个问题,1.将平台升级到x64,2.使用模块pytable。 @K. C:“假设我有一个非常大的(1000000000 条记录)表”是什么?这是属于问题的更多信息吗?请更新问题。请使问题完整且一致。请不要添加随机要求作为对答案的评论。请更新问题。 @S.Lott,1 现在对我来说不可能(这与成本无关),2 不能支持 SQL。另外,我想以一种简单的方式将 numpy.darray 存储(同步)到(with)sqlite db,现有的方法是模块 ATpy,但它只是将表的所有记录读入 numpy.darray。为了解决内存问题,我可能需要一个基于缓冲区的记录适配器,就像内存缓存页面或 linux “更多”命令一样,它可能会给那些大记录一个固定的窗口缓冲区,并且仅在必要时读取和处理数据。【参考方案2】:linecache 模块可能会有所帮助 - 您可以调用 getline(filename, lineno)
以有效地从给定文件中检索行。
您仍然需要弄清楚屏幕的高度和宽度。快速浏览一下,大约有 14 种不同的方法可以做到这一点,其中一些可能已经过时了。 curses 模块可能是您最好的选择,如果您希望能够顺利向后滚动,我认为是否有必要。
【讨论】:
以上是关于对于非常大的元组/文件/数据库记录/numpy.ndarray,linux“更多”类似于python中的代码?的主要内容,如果未能解决你的问题,请参考以下文章