Ruby или Python для тяжелых сценариев импорта? - PullRequest
2 голосов
/ 31 декабря 2010

У меня есть приложение, написанное на PHP (для symfony), которое импортирует большие файлы CSV (до 100 000 строк). Это реальная проблема использования памяти. Пройдя около 15 000 рядов, он останавливается.

Я знаю, что есть меры, которые я мог бы предпринять в PHP, но я все равно с PHP покончил.

Если бы я хотел написать приложение, которое импортирует файлы CSV, как вы думаете, будет ли существенная разница между Ruby и Python? Любой из них ориентирован на большее количество задач, связанных с импортом? Я понимаю, что задаю вопрос, основанный на очень небольшом количестве информации. Не стесняйтесь просить меня прояснить ситуацию или просто говорить по-настоящему.

Если это имеет какое-то значение, мне действительно нравится Lisp, и я бы предпочел Lispier двух языков, если это возможно.

Ответы [ 4 ]

10 голосов
/ 31 декабря 2010

Во что вы импортируете файл CSV? Не могли бы вы проанализировать файл CSV таким образом, чтобы не загружать все это в память сразу (т.е. работать с одной строкой за раз)?

Если это так, то вы можете использовать стандартную библиотеку CSV Ruby, чтобы сделать что-то вроде следующего "

CSV.open('csvfile.csv', 'r') do |row|
  #executes once for each row
  p row
end

Теперь не принимайте этот ответ в качестве непосредственной причины для перехода на Ruby. Я был бы очень удивлен, если бы PHP не обладал подобной функциональностью в своей библиотеке CSV, поэтому вам следует более тщательно изучить PHP, прежде чем решить, что вам нужно переключать языки.

9 голосов
/ 31 декабря 2010

Во что вы импортируете файл CSV? Не могли бы вы проанализировать файл CSV таким образом, чтобы не загружать все это в память сразу (т.е. работать с одной строкой за раз)?

Если это так, то вы можете использовать стандартную библиотеку Python csv, чтобы сделать что-то вроде следующего

import csv
with open('csvfile.csv', 'rb') as source:
    rdr= csv.reader( source )
    for row in rdr:
        # do whatever with row

Теперь не принимайте этот ответ как непосредственную причину перехода на Python. Я был бы очень удивлен, если бы у PHP не было подобной функциональности в его библиотеке CSV и т. Д.

3 голосов
/ 31 декабря 2010

Эквивалент в python (подождите):

import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
    print row

Этот код не загружает сначала весь файл csv в память, а анализирует его построчно с помощью итераторов. Могу поспорить, что ваша проблема происходит «после» чтения строки, где вы каким-то образом буферизируете данные (сохраняя их в словаре или каком-либо массиве).

При работе с большими данными вам нужно как можно быстрее отбрасывать данные и как можно меньше буферизовать. В приведенном выше примере «print» делает именно это, выполняя некоторую операцию над строкой данных, но не сохраняя / не буферизируя какую-либо из них, поэтому GC python может покончить с этой ссылкой, как только закончится область цикла.

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

1 голос
/ 31 декабря 2010

Я думаю, что проблема в том, что вы загружаете CSV в память сразу.Если это так, то я уверен, что и Python / ruby ​​взорвется от вас.Я большой поклонник python, но это всего лишь личное мнение.

...