Чтение файлов параллельно в python - PullRequest
0 голосов
/ 03 июня 2011

У меня есть куча файлов (почти 100), которые содержат данные в формате: (количество человек) \ т (средний возраст)

Эти файлы были сгенерированы в результате случайной прогулки по населению определенной демографической группы. Каждый файл имеет 100 000 строк, что соответствует среднему возрасту населения размером от 1 до 100 000. Каждый файл соответствует определенной местности в стране третьего мира. Мы будем сравнивать эти значения со средним возрастом населенных пунктов аналогичного размера в развитой стране.

То, что я хочу сделать, это

for each i (i ranges from 1 to 100,000):
  Read in the first 'i' values of average-age
  perform some statistics on these values

Это означает, что для каждого прогона i (где i колеблется от 1 до 100 000), прочитайте в первых i значения среднего возраста, добавьте их к списку и запустить несколько тестов (например, Колмогоров-Смирнов или хи-квадрат)


Чтобы открыть все эти файлы параллельно, я подумал, что лучшим способом будет словарь файловых объектов. Но я застрял в попытке сделать вышеуказанные операции.

Является ли мой метод наилучшим (по сложности)?

Есть ли лучший метод?

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

На самом деле можно хранить 10 000 000 строк в памяти.

Создать словарь, где ключи number of people, а значения - это списки average age, где каждый элемент списка имеет свой файл.,Поэтому, если имеется 100 файлов, каждый из ваших списков будет иметь 100 элементов.

Таким образом, вам не нужно хранить файловые объекты в dict

Надеюсь, это поможет

1 голос
/ 03 июня 2011

Почему бы не воспользоваться простым подходом:

  • Открывайте каждый файл последовательно и читайте его строки, чтобы заполнить структуру данных в памяти
  • Выполнение статистики по структуре данных в памяти

Вот автономный пример с 3 «файлами», каждый из которых содержит 3 строки. Для удобства он использует StringIO вместо реальных файлов:

#!/usr/bin/env python
# coding: utf-8

from StringIO import StringIO

# for this example, each "file" has 3 lines instead of 100000
f1 = '1\t10\n2\t11\n3\t12'
f2 = '1\t13\n2\t14\n3\t15'
f3 = '1\t16\n2\t17\n3\t18'

files = [f1, f2, f3]

# data is a list of dictionaries mapping population to average age
# i.e. data[0][10000] contains the average age in location 0 (files[0]) with
# population of 10000.
data = []

for i,filename in enumerate(files):
    f = StringIO(filename)
    # f = open(filename, 'r')
    data.append(dict())

    for line in f:
        population, average_age = (int(s) for s in line.split('\t'))
        data[i][population] = average_age

print data

# gather custom statistics on the data

# i.e. here's how to calculate the average age across all locations where
# population is 2:
num_locations = len(data)
pop2_avg = sum((data[loc][2] for loc in xrange(num_locations)))/num_locations
print 'Average age with population 2 is', pop2_avg, 'years old'

Вывод:

[{1: 10, 2: 11, 3: 12}, {1: 13, 2: 14, 3: 15}, {1: 16, 2: 17, 3: 18}]
Average age with population 2 is 14 years old
0 голосов
/ 03 июня 2011

Я ... не знаю, нравится ли мне этот подход, но возможно, что он сработает для вас. Он может потреблять большие объемы памяти, но может делать то, что вам нужно. Я предполагаю, что ваши файлы данных пронумерованы. Если это не так, возможно, потребуется адаптация.

# open the files.
handles = [open('file-%d.txt' % i) for i in range(1, 101)]

# loop for the number of lines.
for line in range(100000):
  lines = [fh.readline() for fh in handles]

  # Some sort of processing for the list of lines.

Это может приблизиться к тому, что вам нужно, но опять же, я не знаю, что мне это нравится. Если у вас есть файлы, которые не имеют одинакового количества строк, это может привести к проблемам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...