簡體   English   中英

Python加載大量文件

[英]Python load large number of files

我正在嘗試將以Ensight gold格式保存的大量文件加載到numpy數組中。 為了進行此讀取,我編寫了自己的類libvec,該類讀取幾何文件,然后預分配python將用於保存數據的數組,如下面的代碼所示。

N = len(file_list)
# Create the class object and read geometry file
gvec = vec.libvec(os.path.join(current_dir,casefile))
x,y,z = gvec.xyz()

# Preallocate arrays
U_temp = np.zeros((len(y),len(x),N),dtype=np.dtype('f4'))
V_temp = np.zeros((len(y),len(x),N),dtype=np.dtype('f4'))
u_temp = np.zeros((len(x),len(x),N),dtype=np.dtype('f4'))
v_temp = np.zeros((len(x),len(y),N),dtype=np.dtype('f4'))

# Read the individual files into the previously allocated arrays
for idx,current_file in enumerate(file_list):
    U,V =gvec.readvec(os.path.join(current_dir,current_file))
    U_temp[:,:,idx] = U
    V_temp[:,:,idx] = V

    del U,V

但是,這似乎永遠需要,所以我想知道您是否知道如何加快此過程? 將單個文件讀入數組結構的代碼如下所示:

def readvec(self,filename):
# we are supposing for the moment that the naming scheme PIV__vxy.case PIV__vxy.geo not changes should that
# not be the case appropriate changes have to be made to the corresponding file
    data_temp = np.loadtxt(filename, dtype=np.dtype('f4'), delimiter=None, converters=None, skiprows=4)

    # U value
    for i in range(len(self.__y)):
        # x value counter
        for j in range(len(self.__x)):
            # y value counter
            self.__U[i,j]=data_temp[i*len(self.__x)+j]

    # V value
    for i in range(len(self.__y)):
        # x value counter
        for j in range(len(self.__x)):
            # y value counter
            self.__V[i,j]=data_temp[len(self.__x)*len(self.__y)+i*len(self.__x)+j]

    # W value
    if len(self.__z)>1:

        for i in range(len(self.__y)):
            # x value counter
            for j in range(len(self.__xd)):
                # y value counter
                self.__W[i,j]=data_temp[2*len(self.__x)*len(self.__y)+i*len(self.__x)+j]

        return self.__U,self.__V,self.__W
    else:    
        return self.__U,self.__V

在此先感謝您,並致以誠摯的問候,

Ĵ

沒有任何可比較的測試輸入\\輸出,很難說。 但是我認為這將為您提供與readvec嵌套的for循環相同的U\\V數組。 此方法應比for循環快得多。

U = data[:size_x*size_y].reshape(size_x, size_y)
V = data[size_x*size_y:].reshape(size_x, size_y)

將這些直接返回U_tempV_temp也應該有所幫助。 現在,您正在對數據進行3(?)拷貝,以將其放入U_tempV_temp

  1. 從文件到temp_data
  2. 從temp_data到self .__ U \\ V
  3. 從U \\ V到U \\ V_temp

盡管我的猜測是兩個嵌套了for循環,並且一次訪問一個元素導致了緩慢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM