尝试将csv文件读入python时内存不足

时间:2016-10-29 10:06:13

标签: python matlab csv numpy out-of-memory

我的数据是88200(行)* 29403(列)(大约14Gb)。数据已使用dlmwrite在matlab中创建。我试图使用以下方法在python中读取文件。在所有尝试中我的内存耗尽

我的系统:ubuntu 16.04,RAM 32Gb,交换20Gb Python 2.7.12,pandas:0.19,GCC 5.4.0

1>使用csv:

import csv
import numpy
filename = 'data.txt'
raw_data = open(filename, 'rb')
reader = csv.reader(raw_data, delimiter=',', quoting=csv.QUOTE_NONE)
x = list(reader)
data = numpy.array(x).astype('float')

2a取代;使用numpy loadtxt:

import numpy
filename = 'data.txt'
raw_data = open(filename, 'rb')
data = numpy.loadtxt(raw_data, delimiter=",")

2b是GT;使用numpy genfromtxt:

import numpy
x=np.genfromtxt('vectorized_image_dataset.txt',skip_header=0,skip_footer=0,delimiter=',',dtype='float32')

3>使用pandas.read_csv:

from pandas import *
import numpy as np

tp = read_csv(filepath_or_buffer='data.txt', header=None, iterator=True, chunksize=1000)
df = concat(tp, ignore_index=True)

在上述所有方法中,内存耗尽。

使用dlmwrite(matlab)创建了数据文件。逐个读取图像列表(list.txt),转换为浮点数,矢量化并使用dlmwrite存储。代码如下:

fileID = fopen('list.txt');
N=88200;
C = textscan(fileID,'%s');
fclose(fileID);

for i=1:N

A=imread(C{1}{i});
% convert the file to vector
B=A(:);
% convert the above vector to a row
D=B';
% divide by 256
%E=double(D)/double(256);
E=single(D)/single(256);
dlmwrite('vectorized_image_dataset.txt',E,'-append');
clear A;clear B;clear D;clear E;
end

2 个答案:

答案 0 :(得分:1)

def read_line_by_line(file_path: str):
    with open(filepath) as file:
        for line in file:
            yield line

也许这个函数会对你有所帮助 - 我对Numpy / Pandas不是很熟悉,但是你似乎想要一次加载所有数据并将其存储在内存中。使用上面的函数,您将使用生成器一次只生成一行 - 无需将所有内容存储在RAM中。

答案 1 :(得分:0)

我用pandas.read_csv解决了这个问题。我将data.txt分成四个22050行。然后我做了

tp1 = read_csv(filepath_or_buffer='data_first_22050.txt', header=None, iterator=True, chunksize=1000)
df1 = concat(tp1, ignore_index=True)
tp2 = read_csv(filepath_or_buffer='data_second_22050.txt', header=None, iterator=True, chunksize=1000)
df2 = concat(tp2, ignore_index=True)>>> frames=[df1,df2]
result=concat(frames)
del frames, df1, df2, tp1, tp2
tp3 = read_csv(filepath_or_buffer='data_third_22050.txt', header=None, iterator=True, chunksize=1000)
df3 = concat(tp3, ignore_index=True)
frames=[result,df3]
result2=concat(frames)
del frames, df3, tp3, result
tp4 = read_csv(filepath_or_buffer='data_fourth_22050.txt', header=None, iterator=True, chunksize=1000)
df4 = concat(tp4, ignore_index=True)
frames=[result2,df4]
result3=concat(frames)
del frames, tp4, df4, result2
A=result3.as_matrix()
A.shape

(88200,29403)