2012-04-22 29 views
9

Tôi nắm lấy track1 bộ dữ liệu KDD từ Kaggle và quyết định tải một tập tin CSV 3 cột ~ 2.5GB vào bộ nhớ, trên 16GB bộ nhớ cao EC2 dụ của tôi:vấn đề bộ nhớ lớn đọc trong một tập tin csv sử dụng NumPy

data = np.loadtxt('rec_log_train.txt') 

phiên python ăn hết bộ nhớ của tôi (100%), và sau đó bị giết.

Sau đó tôi đọc cùng một tệp bằng cách sử dụng R (thông qua read.table) và nó sử dụng ít hơn 5 GB ram, đã giảm xuống dưới 2 GB sau khi tôi gọi bộ thu gom rác.

Câu hỏi của tôi là tại sao điều này lại không thành công, và cách thích hợp để đọc một tệp vào bộ nhớ là gì. Có, tôi có thể sử dụng máy phát điện và tránh vấn đề, nhưng đó không phải là mục tiêu.

+0

http://stackoverflow.com/questions/8956832/python-out-of-memory-on-large-csv-file-numpy – Anycorn

+0

Nếu độ chính xác đơn sẽ làm, 'np.fromfile/np.loadtxt (dtype = np.float32) 'sẽ mất ít bộ nhớ hơn, sau đó' X = X.astype (np.float64) 'khi hoàn thành. – denis

Trả lời

6
import pandas, re, numpy as np 

def load_file(filename, num_cols, delimiter='\t'): 
    data = None 
    try: 
     data = np.load(filename + '.npy') 
    except: 
     splitter = re.compile(delimiter) 

     def items(infile): 
      for line in infile: 
       for item in splitter.split(line): 
        yield item 

     with open(filename, 'r') as infile: 
      data = np.fromiter(items(infile), float64, -1) 
      data = data.reshape((-1, num_cols)) 
      np.save(filename, data) 

    return pandas.DataFrame(data) 

này đọc trong file 2.5GB, và serializes ma trận đầu ra. Các tập tin đầu vào được đọc trong "lazily", do đó, không có cấu trúc dữ liệu trung gian được xây dựng và bộ nhớ tối thiểu được sử dụng. Tải ban đầu mất một thời gian dài, nhưng mỗi lần tải tiếp theo (của tệp được tuần tự hóa) là nhanh. Xin vui lòng cho tôi nếu bạn có lời khuyên!

+1

Nếu bạn đang chỉ định số cột ưu tiên, tại sao không làm điều gì đó giống như thế này: https://gist.github.com/2465280? Trên một mặt lưu ý, để tạo một mảng từ một trình tạo, sử dụng 'np.fromiter'. Đã cập nhật –

+0

! Cảm ơn bạn rất nhiều! – vgoklani

2

Thử đăng ký lại bây giờ: http://code.google.com/p/recfile/. Có một vài nỗ lực tôi biết để tạo một trình đọc tệp C/C++ nhanh cho NumPy; nó nằm trong danh sách todo ngắn của tôi cho gấu trúc vì nó gây ra vấn đề như thế này. Warren Weckesser cũng có một dự án ở đây: https://github.com/WarrenWeckesser/textreader. Tôi không biết cái nào tốt hơn, thử cả hai?

Các vấn đề liên quan