2017-05-26 106 views
0

我想讀取一個大的txt文件(1.6 GB),以便將其內容存儲在字典中。我正面臨着閱讀文件的困難,並且需要很多時間才能完成。其實我不知道跑整個代碼所需的確切時間,因爲我在等待:(10分鐘後停止Python:操縱大文本文件

這裏是代碼:

import numpy as np 
import pylab as pl 
import matplotlib.pyplot as plt 
import fileinput 
import time 



def extractdata2(): 
    start_time = time.time() 
    accel_data = { 'timestamp': [], 'sensor': [], 'x': [], 'y': [], 'z': [] } 
    accel_uncalib_data = { 'timestamp': [], 'sensor': [], 'x_uncalib': [], 'y_uncalib': [], 'z_uncalib': [], 'x_bias': [], 'y_bias': [], 'z_bias': [] } 
    gyro_data = { 'timestamp': [], 'sensor': [], 'x': [], 'y': [], 'z': []} 
    gyro_uncalib_data = { 'timestamp': [], 'sensor': [], 'x_uncalib': [], 'y_uncalib': [], 
'z_uncalib': [], 'x_drift': [], 'y_drift': [], 'z_drift': []} 
    magnet_data = { 'timestamp': [], 'sensor': [], 'x': [], 'y': [], 'z': [] } 
    magnet_uncalib_data = { 'timestamp': [], 'sensor': [], 'x_uncalib': [], 'y_uncalib': [], 'z_uncalib': [], 'x_bias': [], 'y_bias': [], 'z_bias': []} 

    with open("accelerometer.txt") as myfile: 
     for line in myfile: 
      line = line.split(',') 
      if "TYPE_ACCELEROMETER" in line: 
        #IMU_data["accel_data"] = line # the line must be split in 4 camps 

       accel_data["timestamp"].append(line[ 0 ]) 
       accel_data["sensor"].append(line[ 1 ]) 
       accel_data["x"].append(line[ 2 ]) 
       accel_data["y"].append(line[ 3 ]) 
       accel_data["z"].append(line[ 4 ]) 
       #print(accel_data) 
      elif "TYPE_ACCELEROMETER_UNCALIBRATED" in line: 
       accel_uncalib_data["timestamp"].append(line[ 0 ]) 
       accel_uncalib_data["sensor"].append(line[ 1 ]) 
       accel_uncalib_data["x_uncalib"].append(line[ 2 ]) 
       accel_uncalib_data["y_uncalib"].append(line[ 3 ]) 
       accel_uncalib_data["z_uncalib"].append(line[ 4 ]) 
       accel_uncalib_data["x_bias"].append(line[ 5 ]) 
       accel_uncalib_data["y_bias"].append(line[ 6 ]) 
       accel_uncalib_data["z_bias"].append(line[ 7 ]) 
       #print(accel_uncalib_data) 
      elif "TYPE_GYROSCOPE" in line: 
       gyro_data["timestamp"].append(line[ 0 ]) 
       gyro_data["sensor"].append(line[ 1 ]) 
       gyro_data["x"].append(line[ 2 ]) 
       gyro_data["y"].append(line[ 3 ]) 
       gyro_data["z"].append(line[ 4 ]) 
       #print(gyro_data) 
      elif "TYPE_GYROSCOPE_UNCALIBRATED" in line: 
       gyro_uncalib_data["timestamp"].append(line[ 0 ]) 
       gyro_uncalib_data["sensor"].append(line[ 1 ]) 
       gyro_uncalib_data["x_uncalib"].append(line[ 2 ]) 
       gyro_uncalib_data["y_uncalib"].append(line[ 3 ]) 
       gyro_uncalib_data["z_uncalib"].append(line[ 4 ]) 
       gyro_uncalib_data["x_drift"].append(line[ 5 ]) 
       gyro_uncalib_data["y_drift"].append(line[ 6 ]) 
       gyro_uncalib_data["z_drift"].append(line[ 7 ]) 
       #print(gyro_uncalib_data) 
      elif "TYPE_MAGNETIC_FIELD" in line: 
       magnet_data["timestamp"].append(line[ 0 ]) 
       magnet_data["sensor"].append(line[ 1 ]) 
       magnet_data["x"].append(line[ 2 ]) 
       magnet_data["y"].append(line[ 3 ]) 
       magnet_data["z"].append(line[ 4 ]) 
       #print(magnet_data) 
      elif "TYPE_MAGNETIC_FIELD_UNCALIBRATED" in line:   
       magnet_uncalib_data["timestamp"].append(line[ 0 ]) 
       magnet_uncalib_data["sensor"].append(line[ 1 ]) 
       magnet_uncalib_data["x_uncalib"].append(line[ 2 ]) 
       magnet_uncalib_data["y_uncalib"].append(line[ 3 ]) 
       magnet_uncalib_data["z_uncalib"].append(line[ 4 ]) 
       magnet_uncalib_data["x_bias"].append(line[ 5 ]) 
       magnet_uncalib_data["y_bias"].append(line[ 6 ]) 
       magnet_uncalib_data["z_bias"].append(line[ 7 ]) 
       #print(magnet_uncalib_data) 

    print("--- %s seconds ---" % (time.time() - start_time)) 

    return accel_data, accel_uncalib_data, gyro_data, gyro_uncalib_data, magnet_data, magnet_uncalib_data 

我怎樣才能加快我的程序?我已經提前嘗試過許多類似案件在計算器中提到的類型,但它didn't工作。

非常感謝!:)

+0

這可能會更好地服務於[代碼審查堆棧交換](https://codereview.stackexchange.com/)。但我不禁想知道pyspark是否會爲您更好地處理如此大的文件。 –

+0

您的代碼可能因內存問題而中斷,在這種情況下,請嘗試一次性處理大量數據。就像使用任何採樣技術 –

+1

我想知道熊貓是否會是更好的選擇。 – mauve

回答

0

由於Amey亞達夫已建議閱讀大塊的文本文件相當高效的方案。爲了做到這一點,我可以考慮兩種解決方案。

首先,我會建議編寫一個處理大塊文本的生成器。您可以隨意處理每個塊。

其次,一個相當方便的Python庫幫助大型語料庫是Gensim。閱讀教程後,您會發現使用它可以非常容易地將文檔加載到其主題建模軟件中,而不需要將整個文件加載到內存中,因此可以大大減少處理時間你的數據。