現在,我試圖將緯度經度高度格式的大量二進制文件轉換爲基於文本的ECEF笛卡爾格式(x,y,z)。現在的問題是這個過程非常非常緩慢。大(2.1gb +)二進制文件(緯度/長度/高度到ECEF)的快速轉換
我有超過100千兆字節的這些東西來運行,更多的數據可能會進來。我想盡可能快地使這一點的代碼。
現在我的代碼看起來是這樣的:
import mmap
import sys
import struct
import time
pointSize = 41
def getArguments():
if len(sys.argv) != 2:
print """Not enough arguments.
example:
python tllargbin_reader.py input_filename.tllargbin output_filename
"""
return None
else:
return sys.argv
print getArguments()
def read_tllargbin(filename, outputCallback):
f = open(filename, "r+")
map = mmap.mmap(f.fileno(),0)
t = time.clock()
if (map.size() % pointSize) != 0:
print "File size not aligned."
#return
for i in xrange(0,map.size(),pointSize):
data_list = struct.unpack('=4d9B',map[i:i+pointSize])
writeStr = formatString(data_list)
if i % (41*1000) == 0:
print "%d/%d points processed" % (i,map.size())
print "Time elapsed: %f" % (time.clock() - t)
map.close()
def generate_write_xyz(filename):
f = open(filename, 'w', 128*1024)
def write_xyz(writeStr):
f.write(writeStr)
return write_xyz
def formatString(data_list):
return "%f %f %f" % (data_list[1], data_list[2],data_list[3])
args = getArguments()
if args != None:
read_tllargbin(args[1],generate_write_xyz("out.xyz"))
convertXYZ()基本換算公式這裏: http://en.wikipedia.org/wiki/Geodetic_system
我在想,如果這將是更快的塊讀的東西〜一個線程〜4MB,把它們放在一個有界的緩衝區中,有一個不同的線程用於轉換爲字符串格式,並且有一個最終的線程將字符串寫回到另一個硬盤上的文件中。我可能會跳槍雖然...
我現在正在使用python進行測試,但如果我可以更快地處理這些文件,我不會反對切換。
任何建議將是偉大的。由於
編輯:
我曾與異形的CPROFILE再次代碼,這一次拆分字符串格式和IO。看來我實際上是被字符串格式殺死的......這裏是探查器報告
20010155 function calls in 548.993 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 548.993 548.993 <string>:1(<module>)
1 0.016 0.016 548.991 548.991 tllargbin_reader.py:1(<module>)
1 24.018 24.018 548.955 548.955 tllargbin_reader.py:20(read_tllargbin)
1 0.000 0.000 0.020 0.020 tllargbin_reader.py:36(generate_write_xyz)
10000068 517.233 0.000 517.233 0.000 tllargbin_reader.py:42(formatString)
2 0.000 0.000 0.000 0.000 tllargbin_reader.py:8(getArguments)
10000068 6.684 0.000 6.684 0.000 {_struct.unpack}
1 0.002 0.002 548.993 548.993 {execfile}
2 0.000 0.000 0.000 0.000 {len}
1 0.065 0.065 0.065 0.065 {method 'close' of 'mmap.mmap' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {method 'fileno' of 'file' objects}
10003 0.955 0.000 0.955 0.000 {method 'size' of 'mmap.mmap' objects}
2 0.020 0.010 0.020 0.010 {open}
2 0.000 0.000 0.000 0.000 {time.clock}
有沒有更快的格式化字符串的方法?
你是否分析了代碼以找出哪些部分很慢? – Daenyth
如果你的辦公室裏有幾臺電腦沒有做任何事情,也許你可以考慮hadoop? http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/希望它不會必須通過 –
如果將'write'調用改爲' f.write(「some_string_of_about_the_length_of_your_numbers」)'所以你可以看到有多少時間是字符串格式? – agf