如何在从csv文件中读取数据时减少延迟?

时间:2014-07-25 15:13:59

标签: python

我有一个excel,其中有2000行,每行包含1个数据,如

a.xls

RowNum    Item 
1          'A'
2          'B'
3          'C'
.
.
.
2000      'xyz'

我有另一个文件b.xls,其中包含大约6300000行数据。在此文件中,a.xls中出现了一些数据。我需要从与b.xls中的项目对应的文件a.xls中选择所有数据,并将其存储在名为A.csvB.csv等的单独文件中

我是使用多线程完成的,但它需要花费大量时间来执行它。任何人都可以帮我减少延迟吗?

这是我用过的代码。以下函数在一个线程中开始,

def parseFromFile(pTickerList):
    global gSearchList

    lSearchList = gSearchList

    for lTickerName in pTickerList:
        c = csv.writer( open("op-new/"+ lTickerName + ".csv", "wb"))
        c.writerow(["Ticker Name", "Time Stamp","Price", "Size"])

        for line in lSearchList:
            lSplittedLine = line.split(",")
            lTickerNameFromSearchFile = lSplittedLine[0].strip()

            if lTickerNameFromSearchFile[0] == "#":
                continue

            if ord(lTickerName[0]) < ord(lTickerNameFromSearchFile[0]):
                break
            elif ord(lTickerName[0]) > ord(lTickerNameFromSearchFile[0]):
                continue

            if lTickerNameFromSearchFile == lTickerName:
                lTimeStamp = Decimal(float(lSplittedLine[1]))
                lPrice = lSplittedLine[2]
                lSize = lSplittedLine[4]


                    if str(lTimeStamp)[len(str(lTimeStamp))-2:] == "60":
                        lTimeStamp = str(lTimeStamp)[:len(str(lTimeStamp))-2] + "59.9"

                    if str(lTimeStamp).find(".") >= 0:
                        lTimeStamp = float(str(lTimeStamp).split(".")[0] + "." + str(lTimeStamp).split(".")[1][0])
                        lTimeStamp1 = "%.1f" %float(lTimeStamp)
                        lHumanReadableTimeStamp = datetime.strptime(str(lTimeStamp1), "%Y%m%d%H%M%S.%f")
                    else:
                        lHumanReadableTimeStamp = datetime.strptime(str(lTimeStamp), "%Y%m%d%H%M%S")

                except Exception, e:
                    exc_type, exc_obj, exc_tb = sys.exc_info()
                    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]      
                    print(exc_type, fname, exc_tb.tb_lineno)
                    print line
                    print lTimeStamp
                    raw_input()

                c.writerow([lTickerNameFromSearchFile, lHumanReadableTimeStamp,lPrice, lSize])

1 个答案:

答案 0 :(得分:0)

很难查看代码并完全理解它,因为它引用的变量与您的解释不同,但我相信这种方法会对您有所帮助。

首先将所有a.csv读入set,其中包含您希望能够查找的特征。 Python中的sets具有非常快的查找时间。这也会对你有所帮助,因为你在上面的代码内循环中做了很多重复计算。

然后开始阅读b.csv,使用之前的a.csv set进行检查。每当您找到匹配项时,请写信至A.csvB.csv

您可以对当前设置进行的大幅加速是删除内循环中的重复计算,并消除对线程的需求。因为a.csv只有2000行,所以读起来会非常快。

如果您希望我扩展其中的任何部分,请告诉我。