Hướng dẫn python read lines in chunks - python đọc các dòng theo từng đoạn

Vì yêu cầu đã được thêm vào rằng có phân phối thống kê các dòng được chọn từ tệp, tôi cung cấp cách tiếp cận đơn giản này.

"""randsamp - extract a random subset of n lines from a large file"""

import random

def scan_linepos[path]:
    """return a list of seek offsets of the beginning of each line"""
    linepos = []
    offset = 0
    with open[path] as inf:     
        # WARNING: CPython 2.7 file.tell[] is not accurate on file.next[]
        for line in inf:
            linepos.append[offset]
            offset += len[line]
    return linepos

def sample_lines[path, linepos, nsamp]:
    """return nsamp lines from path where line offsets are in linepos"""
    offsets = random.sample[linepos, nsamp]
    offsets.sort[]  # this may make file reads more efficient

    lines = []
    with open[path] as inf:
        for offset in offsets:
            inf.seek[offset]
            lines.append[inf.readline[]]
    return lines

dataset = 'big_data.txt'
nsamp = 5
linepos = scan_linepos[dataset] # the scan only need be done once

lines = sample_lines[dataset, linepos, nsamp]
print 'selecting %d lines from a file of %d' % [nsamp, len[linepos]]
print ''.join[lines]

Tôi đã thử nghiệm nó trên một tệp dữ liệu giả gồm 3 triệu dòng bao gồm 1,7GB trên đĩa. scan_linepos thống trị thời gian chạy mất khoảng 20 giây trên máy tính để bàn không nóng của tôi.

Chỉ để kiểm tra hiệu suất của sample_lines, tôi đã sử dụng mô -đun timeit như vậy

import timeit
t = timeit.Timer['sample_lines[dataset, linepos, nsamp]', 
        'from __main__ import sample_lines, dataset, linepos, nsamp']
trials = 10 ** 4
elapsed = t.timeit[number=trials]
print u'%dk trials in %.2f seconds, %.2fµs per trial' % [trials/1000,
        elapsed, [elapsed/trials] * [10 ** 6]]

Cho các giá trị khác nhau của nsamp; Khi nsamp là 100, một sample_lines đã hoàn thành trong 460, và tỷ lệ tuyến tính lên đến 10k mẫu với tốc độ 47ms mỗi cuộc gọi.

Câu hỏi tiếp theo tự nhiên là ngẫu nhiên là hầu như không ngẫu nhiên ở tất cả ?, Và câu trả lời là "phụ cryptographic nhưng chắc chắn tốt cho tin sinh học".

Bài viết này cho thấy một trình tạo python cho phép bạn đọc các dòng từ một tệp, chia nó thành các chucks hoặc khối, để cho phép bạn dễ dàng & nbsp; song song với một chương trình để phân tích một tệp rất lớn, mà không phải chia tệp đó trong các tệp nhỏ hơn riêng biệt trước tiên .

Giả sử bạn có một tệp văn bản lớn trong đó mỗi dòng là một hàng dữ liệu và bạn muốn xử lý tất cả dữ liệu này để đưa ra một số loại thống kê. Trong hầu hết các trường hợp như thế này, những gì bạn có là một vấn đề đáng xấu hổ & NBSP; vấn đề song song, và bạn có thể dễ dàng làm cho chương trình của mình nhanh hơn bằng cách làm theo các bước sau:

  1. Chia dữ liệu của bạn thành các khối hoặc khối.
  2. Xử lý các khối này một cách riêng biệt và tạo ra một kết quả trung gian cho mỗi khối.
  3. Kết hợp kết quả cho từng khối để tạo ra kết quả cho toàn bộ dữ liệu.

Đây là cách mô hình của bản đồ/giảm hoạt động của bản đồ và đây là loại vấn đề bạn có thể sử dụng Hadoop Streaming & NBSP; để giải quyết, hoặc sử dụng lợn, hoặc cũng viết một tập lệnh để chạy trong AWS EMR, hoặc một cái gì đó tương tự.

Vấn đề là sử dụng các công cụ này trước hết của bạn phải có toàn bộ môi trường được thiết lập độc đáo và dữ liệu của bạn phải được lưu trữ ở đúng nơi và quan trọng nhất: dữ liệu của bạn cũng phải được chia thành Chucks. Chà, đó có thể là một mối phiền toái nếu tất cả những gì bạn có là một tệp lớn mà bạn muốn phân tích và bạn cũng không phải đối phó với hàng tấn máy tính trên mạng. Thay vào đó, tất cả những gì bạn muốn là phân phối tải của bạn qua một vài bộ xử lý trong máy tính cá nhân của bạn chẳng hạn.

Vì vậy, đây là kịch bản vấn đề: Tôi có một tệp lớn duy nhất tôi muốn xử lý và tất cả những gì tôi muốn làm là mã hóa một tập lệnh Python duy nhất để thực hiện công việc. Tôi đã mã hóa tất cả các phân tích và tôi đã có thể xử lý tệp lớn đó thành một quy trình duy nhất. Bây giờ tôi muốn sử dụng mô -đun đa xử lý để song song hóa quá trình.

Vì vậy, ban đầu chúng tôi có một số mã như

fp = open[filename]
for line in fp.readlines[]:
    process[line]

Những gì tôi đã tạo là một trình tạo chọn một đối tượng tệp, và sau đó lặp lại các dòng của các dòng của N-Th th của các dòng. Bước đầu tiên là tìm ra kích thước tệp, những gì được thực hiện bằng cách tìm đến cuối tệp. Sau đó, chúng tôi chia kích thước tệp cho số lượng khối và nhân với chỉ mục của khối mà chúng tôi muốn xử lý. Điều đó cho chúng ta sự khởi đầu của khối. Sau đó, chúng tôi nhanh chóng chuyển tiếp đến đầu dòng tiếp theo và bắt đầu mang lại các dòng chunk, cho đến khi chúng tôi bắt đầu phần tiếp theo, hoặc đến cuối tệp. Đây là trình tạo và cách sử dụng nó:

def file_block[fp, number_of_blocks, block]:
    '''
    A generator that splits a file into blocks and iterates
    over the lines of one of the blocks.

    '''

    assert 0 

Bài Viết Liên Quan

Chủ Đề