2013-03-05 64 views
7

這是一個以前question,其中以改善功能的蟒蛇時的表現我需要找到一種有效的方式來分割我的文本文件Efficent方式蟒蛇

來分割大文本文件我有以下的文字文件(超過32 GB)沒有排序

.................... 
0 274 593869.99 6734999.96 121.83 1, 
0 273 593869.51 6734999.92 121.57 1, 
0 273 593869.15 6734999.89 121.57 1, 
0 273 593868.79 6734999.86 121.65 1, 
0 272 593868.44 6734999.84 121.65 1, 
0 273 593869.00 6734999.94 124.21 1, 
0 273 593868.68 6734999.92 124.32 1, 
0 274 593868.39 6734999.90 124.44 1, 
0 275 593866.94 6734999.71 121.37 1, 
0 273 593868.73 6734999.99 127.28 1, 
............................. 

所述第一和第二列是ID(例如:0 -273)的X,Y,Z中的網格點的位置的。

def point_grid_id(x,y,minx,maxy,distx,disty): 
    """give id (row,col)""" 
    col = int((x - minx)/distx) 
    row = int((maxy - y)/disty) 
    return (row, col) 

(minx, maxx)是我的網格大小爲distx,disty起源。標識牌的數量是

tiles_id = [j for j in np.ndindex(ny, nx)] #ny = number of row, nx= number of columns 
from [(0,0),(0,1),(0,2),...,(ny-1,nx-1)] 
n = len(tiles_id) 

我需要切片〜32 GB的文件中n (= len(tiles_id))數量的文件。

我可以做到這一點沒有排序,但閱讀n次文件。由於這個原因,我希望從(0,0) (= tiles_id[0])開始的文件找到一個有效的分割方法。之後,我只能讀取一次分割的文件。

+4

如何不使用python? – 2013-03-05 15:13:52

+4

我愛Python! – 2013-03-05 15:14:26

+0

不知道如何真正用Python來排序該文件的大小。 – 2013-03-05 15:15:04

回答

5

無論使用Python還是命令行工具(sort),對32GB文件都難以進行排序。數據庫看起來太強大了,但可以使用。但是,如果你不願意使用數據庫,我會建議使用tile ID將文件分割成文件。

您讀取一行,從瓷磚ID中創建文件名並將該行附加到該文件。並繼續,直到源文件完成。它不會太快,但至少與排序不同,它具有O(N)的複雜性。

而且,當然,可以對文件進行單獨排序並將它們連接起來。排序32GB文件的主要瓶頸應該是內存,而不是CPU。

這,我想:

def temp_file_name(l): 
    id0, id1 = l.split()[:2] 
    return "tile_%s_%s.tmp" % (id0, id1) 

def split_file(name): 
    ofiles = {} 
    try: 
     with open(name) as f: 
      for l in f: 
       if l: 
        fn = temp_file_name(l) 
        if fn not in ofiles: 
         ofiles[fn] = open(fn, 'w') 
        ofiles[fn].write(l) 
    finally: 
     for of in ofiles.itervalues(): 
      of.close() 

split_file('srcdata1.txt') 

但如果有大量的磚,比你更可以打開的文件數,你可以這樣做:

def split_file(name): 
    with open(name) as f: 
     for l in f: 
      if l: 
       fn = temp_file_name(l) 
       with open(fn, 'a') as of: 
        of.write(l) 

而大多數完美主義的方式是關閉一些文件,並在達到打開文件編號的限制後將其從字典中刪除。

+0

然後您可以輕鬆地對單個文件進行排序。 – 2013-03-05 15:19:32

+0

但是我需要只讀一次嗎? – 2013-03-05 15:19:34

+3

當然有可能。你必須使用多文件排序和合並,但這是可能的。 – 2013-03-05 15:19:43

1

快速谷歌帶我到ActiveState代碼中的this recipe。它沒有給出任何性能比較,但它似乎做了工作。

簡而言之,它似乎做了@Ellioh建議的事情,而且你有一個現成的配方,你可能不必重新發明輪子。