大数据的最小处理时间和内存

时间:2013-07-03 21:20:27

标签: python memory

我是一个相当新的程序员。所以我正在查看来自文件的数据,我必须以最少的处理时间和内存的方式订购数据。我想到的方法之一是实现一个平衡的二进制文件以有序的方式存储数据,以便我可以以非常有效的方式检索它。为了测试,我以这种方式生成我的日志文件。

import time
import random

JITTER = 275 
TICKS = 1000
LINES_PER_TICK = 1000

def log_line(now):
    timestamp = now - (random.random() * JITTER)
    return "%f   City %d" % (timestamp, random.randint(0,10000))

start = time.time()

for tick in xrange(TICKS):
    now = start + tick
    for num_line in xrange(LINES_PER_TICK):
    print(log_line(now))

平衡二叉树是实现这样一个程序的最佳方法。是否有更好的方法来做同样的事情?感谢。

1 个答案:

答案 0 :(得分:0)

我假设您要做的主要事情是:

  1. 在最后添加新的日志行。
  2. 在结尾附近添加一个新的日志行(如果你的程序是多线程的或者是异步的)。
  3. 搜索最接近给定时间戳的行。
  4. 搜索给定时间范围内的所有行。
  5. 对于所有这些,二叉搜索树是O(log N)。所以是跳过列表或B树,或许多其他数据结构。

    那么,你如何在它们之间做出选择?

    嗯,除非你真的需要自己构建,否则你可能更关心界面而不是精确的性能特征,只要它们都“足够快”,它们可能就是这样。例如,blist.sorteddict是一个精心设计的类,它与dict的替代品一样接近,因为任何排序都可以。 bintrees.RBTree有一些很酷的功能,比如您可能不会想到的关键切片,但是一旦找到它们就可能会一直使用。 sqlite3可以简单地支持磁盘,并且可以通过系统上已有的漂亮工具进行搜索。可能其中一个比B +树,红黑树和带有B树索引的数组之间的差异更重要。

    如果挤出最后一点性能 很重要,你可能想要在特征系统上测试真实的数据集,而不是试图猜测。有一些好的经验法则:如果你有足够的数据可以交换到内存,B树很好;跳过列表适用于细粒度锁定;跳过列表适合阅读大范围;二叉树有利于按位置而不是键快速逼近;但是你仍然想要测试你的猜测,所以不要过多地投入猜测。